开发者

NSDate returns wrong date on the first of month

开发者 https://www.devze.com 2023-03-17 21:58 出处:网络
My app used [NSDate date ] function to get current date. Its work fine other days except 开发者_开发百科1st of every month during AM. i.e Follow Following steps :

My app used [NSDate date ] function to get current date. Its work fine other days except 开发者_开发百科1st of every month during AM. i.e Follow Following steps :

  1. Set the system date as 01 - June - 2011 & time between 00.00 midnight to 5.59 AM.
  2. Use following code :

    NSLog(@"Current Date :: %@",[NSDate date]);

The O/P is :: Current Date :: 2011-05-31 19:40:21 +0000

Desired O/P is :: Current Date :: 2011-06-01 00:00:0( i.e.the time which is set ) +0000

Also From 6 AM it works fine.

What is reason for this?

Actually I don't want NSDate in string format but what I want is NSDate date object corresponding to 1st date of current month. For which i use following snippet of code :

NSCalendar *gregorian = [[NSCalendar alloc]initWithCalendarIdentifier:NSGregorianCalendar];
[gregorian setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];

NSDateComponents *comp = [gregorian components:(NSYearCalendarUnit | NSMonthCalendarUnit 
| NSDayCalendarUnit) fromDate:[NSDatedate]];

[comp setDay:1];     

NSDate *firstDayOfMonthDate = [gregorian dateFromComponents:comp];

[gregorian release];

return firstDayOfMonthDate;

Since [NSDate date] returns wrong date, components also contains wrong date. The above code works for all senario except the senario which i posted in beginning of this thread. What should I do?


Finally got the solution:

The point is, NSDate objects don't have a time zone associated with them, and a few releases back someone in Apple decided that NSDate's -description method, which is what NSLog uses, should use GMT+0 and NOT the local time zone for output. (I assume someone had a bug where they corrupted their locale setting, and that caused NSDate's -description method to crash, and so bug reports got filed...)

The short version: Use NSDateFormatter to output dates. Don't use -description.


Are you running iOS version 4.2? If so, there is some kind of issue with the date method, it does not seem to respect your local time zone. For example, if I run your code in the iOS 4.0 simulator, I get this output:

Current Date :: 2011-07-06 10:43:38 -0400

But if I run it in the iOS 4.2 simulator, I get this:

Current Date :: 2011-07-06 14:44:18 +0000

Here is another SO post that describes this in more detail:

NSDate et al woes on iOS 4.2

If you are just looking for the current date and time in an NSString, I use code that looks like this to accomplish that task:

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setFormatterBehavior:NSDateFormatterBehavior10_4];
[formatter setDateStyle:NSDateFormatterShortStyle];
[formatter setTimeStyle:NSDateFormatterShortStyle];
NSString *result = [formatter stringFromDate:[NSDate date]];
[formatter release];
NSLog(@"Current Date v2 :: %@",result);
0

精彩评论

暂无评论...
验证码 换一张
取 消