从Unix时间转换给出错误的结果

时间:2014-07-23 11:48:33

标签: ios objective-c xcode unix-timestamp

我正在尝试将Unix时间字符串转换为Xcode中的Date,但是我的错误时间持续了两个小时。我无法弄清楚我做错了什么。有人能帮帮我吗?

NSString *unixTime = @"1402473600";
NSTimeInterval timeStamp = [unixTime doubleValue];
NSDate *date = [NSDate dateWithTimeIntervalSince1970:timeStamp];

它给了我:2014-06-11 10:00:00 CEST

...但应该是:2014-06-11 08:00:00 CEST

1 个答案:

答案 0 :(得分:1)

xCode返回UTC + 0时区中的正确值。不要忘记CEST是UTC + 2。以下是测试它的代码段:

// your code
NSString *unixTime = @"1402473600";
NSTimeInterval timeStamp = [unixTime doubleValue];
NSDate *date = [NSDate dateWithTimeIntervalSince1970:timeStamp];
NSLog(@"%@", date); // 08:00:00 +0000

// CEST, UTC+2 formatting
NSDateFormatter *localDF = [[NSDateFormatter alloc] init];
[localDF setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"CEST"]]; // which is CEST, which is UTC+2
[localDF setDateFormat:@"HH:mm:ss Z"];

NSLog(@"%@", [localDF stringFromDate:date]); // 10:00:00 +0200

您可以将日期转换为CEST时区。根据结果​​,您可以将给定日期转换为具有调整值的新日期变量,或者根据所需时区创建字符串表示:

变体1.使用时区返回给定日期的字符串表示形式:

NSDateFormatter *cestDF = [[NSDateFormatter alloc] init];
[cestDF setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"CEST"]]; // which is CEST, which is UTC+2
[cestDF setDateFormat:@"HH:mm:ss Z"];
NSString *cestDateStr = [cestDF stringFromDate:date];

变体2.新的和调整后的日期对象:

NSTimeInterval timeZoneOffset = [[NSTimeZone timeZoneWithAbbreviation:@"CEST"] secondsFromGMT];
NSTimeInterval cestTimeInterval = [date timeIntervalSinceReferenceDate] + timeZoneOffset;
NSDate *cestDate = [NSDate dateWithTimeIntervalSinceReferenceDate:cestTimeInterval];

注意:NSDate内部没有时区概念,所以你应该记住你的NSDate变量在哪个时区。