NSDate - 将日期转换为GMT

时间:2009-12-07 21:10:29

标签: ios objective-c swift nsdate gmt

我需要能够将NSDate值转换为GMT日期。

如何将NSDate值转换为GMT格式NSDate值,与iPhone设备使用的日期区域设置无关?

6 个答案:

答案 0 :(得分:132)

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm";

    NSTimeZone *gmt = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
    [dateFormatter setTimeZone:gmt];
    NSString *timeStamp = [dateFormatter stringFromDate:[NSDate date]];
    [dateFormatter release];

答案 1 :(得分:42)

在Cocoa中使用时间可能很复杂。当您获得NSDate对象时,它位于本地时区。 [[NSTimeZone defaultTimeZone] secondsFromGMT]为您提供GMT当前时区的偏移量。然后你可以这样做:

NSDate *localDate = // get the date
NSTimeInterval timeZoneOffset = [[NSTimeZone defaultTimeZone] secondsFromGMT]; // You could also use the systemTimeZone method
NSTimeInterval gmtTimeInterval = [localDate timeIntervalSinceReferenceDate] - timeZoneOffset;
NSDate *gmtDate = [NSDate dateWithTimeIntervalSinceReferenceDate:gmtTimeInterval];

现在gmtDate应该在GMT中拥有正确的日期。要显示它,请查看NSDateFormatter,特别是setDateStylesetTimeStyle方法。您创建一个NSDateFormatter,按照您想要的方式配置它,然后调用stringFromDate:以获得格式良好的字符串。

答案 2 :(得分:16)

Howard's Answer是正确的,请将其投票并接受。

作为参考,我认为解释日期对象和本地化日期表示之间的区别是有用的。

在许多编程语言中,日期对象用于表示独特的时间点。忽略Relativistic参数可以假设在任何情况下我们都可以定义一个时间点,对于每个时间点而言,无论我们如何测量时间,它都是普遍相同的。

如果我们可以为每个时间点构建一个唯一标签,那么该标签可以被传递并明确引用。 日期对象的目的是作为给定时间点的唯一通用标签

可以提出任何数量的技术来构建这样的标签方案,每个日期对象选择这样做对于使用它们的人来说都是无关紧要的。

一个例子可能是使用来自普遍事件的数字偏移量(自太阳爆炸以来的X秒)。

只有当我们希望花时间点并将其序列化为人类可读的字符串时,我们必须处理时区,语言环境等的复杂性......

本地日期字符串)+(日期格式化程序)=>时间点

时间点+(日期格式化程序)=> (本地日期字符串

每个时间点都是通用的...只有将时间点转换为纽约时间点 gmt时间点才会出现这种情况本地字符串(使用日期格式化程序)会显示与时区的任何关联。

注意:我确定在这个问题上有很多博客/文章,但是我的google foo在这个时候失败了。如果有人有热情扩展这个问题,请随时这样做。

答案 3 :(得分:5)

虽然亚历克斯的答案是一个良好的开端,但它没有处理夏令时(夏令时)并且在参考日期之外增加了不必要的转换。以下适用于我:

要将localDate转换为GMT,请考虑DST:

NSDate *localDate = <<your local date>>
NSTimeInterval timeZoneOffset = [[NSTimeZone systemTimeZone] secondsFromGMTForDate:localDate];
NSDate *gmtDate = [localDate dateByAddingTimeInterval:-timeZoneOffset]; // NOTE the "-" sign!

要将GMT日期转换为localDate,请考虑DST:

NSDate *gmtDate  = <<your gmt date>>
NSTimeInterval timeZoneOffset = [[NSTimeZone systemTimeZone] secondsFromGMTForDate:gmtDate];
NSDate *localDate = [gmtDate dateByAddingTimeInterval:timeZoneOffset];

一个小注释:我使用了dateByAddingTimeInterval,它只是iOS 4。如果您使用的是OS 3或更早版本,请使用addTimerInterval。

答案 4 :(得分:4)

Swift 4

//UTC or GMT ⟺ Local 

extension Date {

    // Convert local time to UTC (or GMT)
    func toGlobalTime() -> Date {
        let timezone = TimeZone.current
        let seconds = -TimeInterval(timezone.secondsFromGMT(for: self))
        return Date(timeInterval: seconds, since: self)
    }

    // Convert UTC (or GMT) to local time
    func toLocalTime() -> Date {
        let timezone = TimeZone.current
        let seconds = TimeInterval(timezone.secondsFromGMT(for: self))
        return Date(timeInterval: seconds, since: self)
    }

}

答案 5 :(得分:3)

您是否尝试过查看NSDateFormatter的文档?

NSDateFormatter

NSDateFormatter似乎有一些使用TimeZones的方法,特别是

-setTimeZone:

我自己没有测试过,但我想如果你将GMT设置为最初在另一个时区中表示的日期的时区,它会显示具有正确调整的日期以匹配新的时区。