使用Objective c将时间段转换为具有良好时区的NSDate

Max*_*me 12 cocoa objective-c

如何将纪元时间值转换为NSDate.例如,我使用此值:1310412600000.我在EDT时区.

当我尝试这个:

NSString *bar = [[NSDate dateWithTimeIntervalSince1970:epoch] description];
Run Code Online (Sandbox Code Playgroud)

我错了价值......

什么是好方法?我花了很多时间......

谢谢

Ste*_*HHH 30

纪元时间(也称为"Unix"和"POSIX"时间)是自1970年初以来的秒数.您可以使用此算法将纪元时间转换为NSDate:

  1. 实例化NSDate对象并将纪元时间作为参数传递给NSDate的initWithTimeIntervalSince1970初始值设定项.你完成了.NSDate对象设置为纪元时间.NSDate在UTC时区内部存储时间.它取决于你如何显示.
  2. [可选]使用NSDateFormatter将NSDate格式化为适当的时区.

这是我使用的代码:

    // Sample string epochTime is number of seconds since 1970
NSString *epochTime = @"1316461149";

// Convert NSString to NSTimeInterval
NSTimeInterval seconds = [epochTime doubleValue];

// (Step 1) Create NSDate object
NSDate *epochNSDate = [[NSDate alloc] initWithTimeIntervalSince1970:seconds];
NSLog (@"Epoch time %@ equates to UTC %@", epochTime, epochNSDate);

// (Step 2) Use NSDateFormatter to display epochNSDate in local time zone
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss zzz"];
NSLog (@"Epoch time %@ equates to %@", epochTime, [dateFormatter stringFromDate:epochNSDate]);

// (Just for interest) Display your current time zone
NSString *currentTimeZone = [[dateFormatter timeZone] abbreviation];
NSLog (@"(Your local time zone is: %@)", currentTimeZone);
Run Code Online (Sandbox Code Playgroud)


Tom*_*mmy 6

根据文件,dateWithTimeIntervalSince1970:运行时间为1970年1月1日格林尼治标准时间00:00.所以你应该比你真正想要的结果晚四个小时得到结果.

因此,最简单的事情 - 如果你不介意从GMT到EDT的硬编码 - 似乎是:

[[NSDate dateWithTimeIntervalSince1970:epoch] dateByAddingTimeInterval:-240]

// or:
[NSDate dateWithTimeIntervalSince1970:epoch - 240]
Run Code Online (Sandbox Code Playgroud)

虽然要消除任意常量(并且更清洁),但您可能需要以下内容:

NSTimeZone *EDTTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"EDT"];

NSInteger secondsDifferenceFromGMT =
    [EDTTimeZone secondsFromGMTForDate:[NSDate dateWithTimeIntervalSince1970:0]];

NSDate *startOfEpoch = 
                 [NSDate dateWithTimeIntervalSince1970:secondsDifferenceFromGMT];

...

NSDate *newDate = [startOfEpoch dateByAddingTimeInterval:firstInterval]; // etc
Run Code Online (Sandbox Code Playgroud)


Kal*_*Kal 1

您是否以秒为单位传递该值?

该方法接受以秒为单位的值,而不是毫秒。

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSDate_Class/Reference/Reference.html