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 分钟的主要内容,如果未能解决你的问题,请参考以下文章

OC - 时间日期类NSDate

NSDate() 或 Date() 显示错误的时间

创建 NSDate 时区问题

创建具有特定时区的 NSDate 对象

对 Cococa NSDate 的彻底失望

NSDate: 我只输入utc时间成分,并正确设置日历,但NSDate不知为何会被重新计算到我的时区。