【问题标题】:Converting NSDate转换 NSDate
【发布时间】:2012-09-12 22:22:01
【问题描述】:

我有一个NSDate(我们称之为x),12 September, 2012 10:18PM (GMT)。我想将x 转换为当前时区 (EST) 午夜前一分钟。因此,转换后以ESTNSDateFormatter 表示的x 将是12 September, 2012 11:59PM (EST)。最好的方法是什么? 谢谢

【问题讨论】:

  • 从我的头顶上,使用NSDateComponents 对象,并将其TimeZone 设置为EST,并将组件设置为23 小时,59 分钟,其余从日期开始给定的。然后,分配一个NSCalendarGregorian 标识符,并得到最终日期:dateFromComponents:... 或者等待正确的答案:)

标签: objective-c ios cocoa-touch nsdate


【解决方案1】:

看看 NSDateComponents:https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSDateComponents_Class/Reference/Reference.html

我相信您需要将 NSDate 转换为 NSDateComponents,将时间设置为晚上 11:59,然后再转换回 NSDate。

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *components = [calendar components:(NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit) fromDate:date];
[components setHour:23];
[components setMinute:59];
NSDate *convertedDate = [calendar dateFromComponents:components];

NSLog(@"date=%@, convertedDate=%@", date, convertedDate);

【讨论】:

  • +1 是的,我就是这么说的。只需添加setTimeZone: 以指定EST
  • 这是否考虑了 localTimezone 或仅参考 GMT 将日期转换为午夜前一分钟?
  • Yes, from developer.apple.com/library/ios/documentation/cocoa/Conceptual/… : "默认情况下,NSCalendar 在创建日历对象时使用应用程序或进程的默认时区。除非已另外设置默认时区,否则它是系统偏好设置中设置的时区。”
【解决方案2】:

使用日期的数字表示可以轻松完成此类操作。在此表示中,您处理的是自参考日期以来的秒数。

timeIntervalSinceReferenceDate 的参考日期是 2001 年 1 月 1 日st,格林威治标准时间 00:00:00。

NSDate* date = [NSDate date];
NSInteger secondsSinceReferenceDate = [date timeIntervalSinceReferenceDate];
secondsSinceReferenceDate += 86400 - (secondsSinceReferenceDate % 86400);
secondsSinceReferenceDate -= 60;
secondsSinceReferenceDate -= [NSTimeZone.localTimeZone secondsFromGMTForDate:date];
NSDate* justBeforeToday =
    [NSDate dateWithTimeIntervalSinceReferenceDate:secondsSinceReferenceDate];

NSLog(@"Date used was %@", date);
NSLog(@"Just before tomorrow is %@", justBeforeToday);

由于一天有 86400 秒(24 小时乘以 60 分钟 60 乘以 60 秒 = 86400 秒),您知道86400 - (secondsSinceReferenceDate % 86400) 是距离午夜还有多少秒。因此,如果您取今天的日期(或任何其他有效日期),加上这个秒数,然后再减去 60 秒,您将在 GMT 时区晚上 11:59 得到今天晚上。

使用[NSTimeZone.localTimeZone secondsFromGMTForDate:],您可以知道您的时区与 GMT 时区相差多少秒。通过将此偏移量减去您的整数表示,您可以有效地得到您当地时区的晚上 11:59。

这是一个示例输出:

Date used was 2012-09-12 22:37:49 +0000
Just before tomorrow is 2012-09-13 03:59:00 +0000

我也在 E​​DT 时区,这看起来是正确的答案(请记住,标准时间是格林威治标准时间 -5,但现在我们处于夏令时,所以它是格林威治标准时间 -4,这是不变的) .

【讨论】:

  • 这是否考虑到时区?输入 NSDate 是 GMT,输出 NSDate 也是 GMT,但是当转换为当前时区时,将产生当前时区午夜前一分钟。
  • @0xSina,我误读了您问题中的一些内容,我会尽快发布更新。
  • @zsneak: 你不应该使用secondsFromGMTForDate: 以便正确地允许夏令时吗?
  • @zneak 感谢您的回答,我真的很喜欢它,但是 jrc 的回答要简单得多,这就是我接受他的原因,但再次感谢!
猜你喜欢
  • 2011-11-01
  • 2011-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-17
  • 2013-06-28
  • 2011-11-25
  • 2011-04-24
相关资源
最近更新 更多