NSdate(时区)中的问题日期时间显示过去 5 小时 30 分钟
Posted
技术标签:
【中文标题】NSdate(时区)中的问题日期时间显示过去 5 小时 30 分钟【英文标题】:Issues in NSdate (Time Zone) date Time displays 5hrs 30 mins past time 【发布时间】:2013-04-02 03:53:33 【问题描述】:实际上在我的模拟器中 TIME 显示过去 5 小时 30 分钟
我现在在印度的时间是 2013-04-02 09:10:__ AM 但输出是 2013-04-02 03:54:51 +0000
2013 年 4 月 - 2 日:上午 9:10
我需要在两个日期之间得到一些结果 1.First Date of month 到 2.Current Date of any day
即从 4 月 1 日到 4 月 2 日上午 9:10 t0 当前时间 2013-04-02 09:10:__ AM
但它显示
当月第一天的日期为 2013-03-31 18:30:00 +0000
当前时间为 2013-04-02 03:54 :51 +0000 但实际时间为 09:10:__ AM
我按如下方式计算该月的第一个日期
// TO IMPLEMENT CODE for FIRST DAY OF the Month
NSCalendar* calendar = [NSCalendar currentCalendar];
NSDateComponents* comps = [calendar components:NSYearForWeekOfYearCalendarUnit |NSYearCalendarUnit|NSMonthCalendarUnit|NSWeekCalendarUnit|NSWeekdayCalendarUnit fromDate:[NSDate date]];
calendar.timeZone = [NSTimeZone systemTimeZone];
[comps setWeekday:1]; // 1: sunday
monthComponent = comps.month;
yearComponent = comps.year;
dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy MM dd"];
dateFormatter.timeZone = [NSTimeZone systemTimeZone];
// To get the firstDateOfMonth for This MONTH.
NSDate *firstDateOfMonth = [dateFormatter dateFromString:[NSString stringWithFormat:@"%d %d 01",yearComponent,monthComponent]];
NSLog(@"firstDateOfMonth-- %@ \r\n",firstDateOfMonth);
NSLog(@"[NSDate date]-- %@",[NSDate date]);
我设置时区 SystemTimeZone 甚至认为 i got wrong results for Current date and firstDateOfMonth
提前致谢
【问题讨论】:
【参考方案1】:问题时区。 默认情况下, NSDateFormatter 设置为您的本地时区。这意味着,如果您的时区是 +5:30,则给它一个日期“1970/18/3”会导致 1970-03-18 00:00:00 +0530。但是,NSLog 总是以 GMT(零)时区打印日期,加上/减去时区差异(5 小时 30 分钟)。
NSCalendar* calendar = [NSCalendar currentCalendar];
NSDateComponents* comps = [calendar components:NSYearForWeekOfYearCalendarUnit |NSYearCalendarUnit|NSMonthCalendarUnit|NSWeekCalendarUnit|NSWeekdayCalendarUnit fromDate:[NSDate date]];
[comps setWeekday:1];
int monthComponent = comps.month;
int yearComponent = comps.year;
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy MM dd"];
NSDate *firstDateOfMonth = [dateFormatter dateFromString:[NSString stringWithFormat:@"%d %d 01",yearComponent,monthComponent]];
firstDateOfMonth = [firstDateOfMonth dateByAddingTimeInterval:19800];
NSLog(@"firstDateOfMonth-- %@ \r\n",firstDateOfMonth);
NSLog(@"[NSDate date]-- %@",[[NSDate date] dateByAddingTimeInterval:19800]);
【讨论】:
【参考方案2】:试试看……
NSDate* date = [NSDate date];
NSDateFormatter* formatter = [[NSDateFormatter alloc] init];
NSTimeZone *destinationTimeZone = [NSTimeZone systemTimeZone];
formatter.timeZone = destinationTimeZone;
[formatter setDateStyle:NSDateFormatterLongStyle];
[formatter setDateFormat:@"MM/dd/yyyy hh:mma"];
NSString* dateString = [formatter stringFromDate:date];
【讨论】:
【参考方案3】:正如 Sunny 所说,问题在于时区,以及对 NSDate 实际含义的误解。
NSDate 表示在世界各地都相同的时间点。如果我们同时调用 [NSDate date] ,我们会得到相同的结果,并且 NSLog 以相同的方式打印它。但是,如果我们都看我们的手表,我们会看到显示的时间不同。
你在印度。如果您正好在午夜看表,它显示的是中午 12 点。如果伦敦的一个人在完全相同的时间看他们的手表,那个人就会看到下午 6:30。他们的手表总是比你的晚 5 1/2 小时。这就是 NSLog 显示的内容。
例如,您正确计算了印度月初的 NSDate。这个月初是 4 月 1 日,在一天开始的午夜——在印度时间。但此时此刻,仍是伦敦的 3 月 31 日,18:30。这就是 NSDate 显示的内容。你总是得到正确的结果。
【讨论】:
【参考方案4】:@ios 开发者,
可能是时区问题。检查您的模拟器设置。使用以下链接:
xcode 4.2 location simulator and Time Zone
也请与[NSTimeZone localTimeZone]
联系。
见以下链接:
NSTimeZone: what is the difference between localTimeZone and systemTimeZone?
【讨论】:
不,问题是对 NSDate 的误解。以上是关于NSdate(时区)中的问题日期时间显示过去 5 小时 30 分钟的主要内容,如果未能解决你的问题,请参考以下文章