Is there an objective-c/iPhone version of currentTimeMillis() from Java? - iphone

I need to time some events in the app I'm working on. In Java i used to be able to call currentTimeMillis() but there doesnt seem to be a version in Objective-c. Is there a way to check there current time without creating a NSDate and then parsing this object everytime i need this information?
Thanks
-Code

[[NSDate date] timeIntervalSince1970] * 1000 returns a the same value as currentTimeMillis()
CFAbsoluteTimeGetCurrent() and [NSDate timeIntervalSinceReferenceDate] both return a double starting at Jan 1 2001 00:00:00 GMT.

There's also CFAbsoluteTimeGetCurrent(), which will give you the time in double-precision seconds.

To get very cheap very precise time, you can use gettimeofday(), which is a C Function of the BSD kernel. Please read the man page for full details, but here's an simple example:
struct timeval t;
gettimeofday(&t, NULL);
long msec = t.tv_sec * 1000 + t.tv_usec / 1000;

Instead gettimeofday() you could also use [NSDate timeIntervalSinceReferenceDate] (the class method) and do your calculations with that. But they have the same problem: they operate on "wall clock time". That means your measurement can be off if leap seconds are added while your test is running or at the transition between daylight saving time.
You can use the Mach system call mach_absolute_time() on OS X and iOS. With the information returned by mach_timebase_info() this can be converted to nanoseconds.

The correct answer is [[NSDate date] timeIntervalSince1970]; this will give you current timestamp in milliseconds.
The answer given by #Noah Witherspoon returns current date but the year is not the current matching year.

Related

how can I store different times from stopwatch

I am confused regarding to calculation of two different times. In my game, when game starts then timer gets started (like stop watch) and it stops when game gets finished. Now I have to store best low time among previous time list.
I am getting time in hh:mm:ss format. how can I store this time so that i can compare it with different time in list ? I tried to store this value in NSString, but the comparison fails.
EDITED :
Let me clarify the Question :
For example how can I store different times from stopwatch and how to sort it in ascending order ?
any suggestions?
Thanks...
Take two NSDates, one at the game start and one at game finish, then calculate the difference.
NSDate *startDate = [NSDate date]; // At game start
NSTimeInterval interval = [[NSDate date] timeIntervalSinceDate:startDate]; // At game finish
NSlog(#"interval: %.2f", interval);
You could use
long stamp = (long)[[NSDate date] timeIntervalSince1970];
for each of your time-relevant situation since the posted code is giving you a UNIX-timestamp. This timestamp can be used in arithmetic operations/comparisons which should be exact what you are looking for.

NSDate date returns 2h less than it should

When i call [NSDate date] it returns 2 hours less than it should. I've checked my computer clock settings and they are all ok. I've checked settings in iPhone and time zone and clock are all OK. Even simulator shows correct time on top toolbar. But when I try to log current date it shows 2 hours less than it should. I ran out of ideas where to look.
All dates returned by [NSDate date] are in the GMT time zone.
When you use any NSDateFormatter, just set the time zone and it will print out the correct time.
Look carefully at the output of the NSLog() statement. You will see that the output always contains the timezone using standard UTC. Therefore, the date is actually correct, taking into account the timezone.
I found my solution here: How to convert time to the time zone of the iPhone device?
So if you ever want to change [NSDate date] to point to local time just use the code provided in the link above. And dont forget to change timeZoneWithAbbreviation on sourceTimeZone from EST to GMT (because NSDate is always in GMT)
Once again thanks everyone for helping out..

How can I create a count up timer with the format seconds:milliseconds?

I'm diving into iOS development and I'm trying to create a count up timer in one of my views. I have the NSTimer code figured out to call a selector once every 0.04 seconds that updates the UILabel. Where I'm having trouble is with the formatting of the current time (starting initially at 00:00). I figured the best way to do this was using the NSDate class, and related classes (NSDateFormatter, NSDateComponents, etc.), but the manipulating of the dates and formats is really confusing me and the code is getting unwieldy quickly. I was hoping there are some SO users that are comfortable using the NSDate class that could help me figure out a simple way to calculate the current time for a count up timer and convert it to an NString with the format 'seconds:milliseconds'.
I'd be happy to post my initial attempt at the NSDate code if requested, but I won't initially because it's really of no use and embarrassing :)
If you just want to display time elapsed since you started your timer you can store starting date somewhere (say, startDate variable) and calculate time interval using current date. Something like the following should work:
NSTimeInterval passed = [[NSDate date] timeIntervalSinceDate: startDate];
double intPart;
double fract = modf(passed, &intPart);
label.text = [NSString stringWithFormat:#"%d:%.2f", (int)intPart, fract];

Objective C: Compare timeInMillis with current time

In my iPhone application, I need to calculate the time difference between the time a message was created on the server, and the time my phone received it.
The server (Java) puts in a number returned by System.currentTimeMillis() as metadata along with the message.
How do I compare this number with the current time on the device? Could not find a suitable NSDate method to do this comparison.
Thanks in advance!
You might take a look at this SO answer and the -timeIntervalSinceDate: method.
You can use (NUInteger) ([[NSDate date] timeIntervalSince1970] * 1000)

Doing comparison on NSDates in different timezones?

I have an array of NSDates which I build from strings using [NSDate dateFromString]
In the xml I parsed to get the string there was also a timezone string. As far as I can see in the manual NSDate does not in it self deal with timezones. Do I need to always store this timezone value somewhere and pair it with the belonging NSDate each time I need it?
I also need to figure out that if an event starts in London at 10:00, but I am in Denmark having my iPhone set to danish time my "event started in London" should display at 09:00 o'clock.
Again if an event starts in London at 10:00 o'clock and ends in Denmark at 12:00 o'clock, If I were to compare start time and end time using an iPhone with danish settings I would get that the duration of the event was 02:00 event though 10:00 o'clock in UK and 12:00 o'clock in Denmark is only 1 hour apart.
NSdate works really well for these things in the scope of one timezone, but introducing the timezone part just made everything complicated to me. Is there a way to abstract/hide all these calculations, as I see potential for making a lot of mistakes.
I have been through the NSDateformatter and NSDate guides from Apple, but they are really vague and sports a substantial amount of deprecated code :/
Thanks for any help given.
You should take one standard timezone like UTC/GMT format for all calculation.
According to the NSDate reference, dateWithString: takes an offset to GMT as last component; while it is not a time zone, it is sufficient to perform computation or comparison).
Looking at the NSTimeZone reference, you can use the abbreviationForDate: and the timeZoneWithAbbreviation: to get a NSTimeZone object from a NSDate instance. Once you get the time zone, you have everything you need.
I convert the present date and the date I would like to know if is close, to GMT and then returning the difference. So I changed every thing to deal with differences instead of actual times and dates. A bit like a music score transposed to a different key:)
+ (NSInteger) minutesUntilDate:(NSDate*) date withTimezoneOffset:(NSInteger) GMTOffset
{
NSDate *now = [NSDate date];
NSTimeInterval localTimeZoneOffset = [[NSTimeZone defaultTimeZone] secondsFromGMT];
now = [now addTimeInterval:(localTimeZoneOffset * -1)];
date = [date addTimeInterval:(GMTOffset * 60 * 60) * −1];
return ((NSInteger)[now timeIntervalSinceDate:date] / 60 ) * -1;
}
As soon as you have allocated an NSDate, these do not have timezone information any longer. NSDate is "timezone-less" and is always in GMT. You should make sure that NSDate understand your format correctly when allocating it.
Once you have an NSDate you can make normal calculations and ignore the timezones.
You only need to take care of timezones when reading strings into NSDates and when printing them out.