【问题标题】:How do I turn an arbitrary time zone into UTC?如何将任意时区转换为 UTC?
【发布时间】:2016-03-15 04:06:54
【问题描述】:

我允许我的用户使用当地时区选择随机日期和时间。我希望能够以 UTC 格式将此日期字符串发送到服务器,以便世界上其他任何人都可以使用他们的本地时区读取它。我在网上阅读了很多关于如何将 UTC 转换为当地时间的文章,但反之则不然。我怎样才能做到这一点?

编辑:

首先,我使用第一个函数获取与用户选择的日期和时间连接的字符串,将其转换为 NSDate,然后将此 NSDate 转换为 UTC 字符串。这是实现我目标的最佳方法吗?

public class func localTimeZoneStringToDate(string: String) -> NSDate {
    let dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
    dateFormatter.timeZone = NSTimeZone.localTimeZone()
    return dateFormatter.dateFromString(string)!
}

public class func UTCStringFromDate(date: NSDate) -> String {
    let dateFormatter = NSDateFormatter()
    dateFormatter.timeZone = NSTimeZone(abbreviation: "UTC")
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
    return dateFormatter.stringFromDate(date)

}

【问题讨论】:

  • NSDate 始终以 UTC 时区存储日期和时间
  • 您必须知道他们的本地日期和时间、他们的时区以及他们是否有夏令时。从这三个参数可以计算UTC
  • RFC 3339/ISO 8601 格式是发送到 Web 服务的标准。并且,如果用户的设备未使用公历,请记住使用 en_US_POSIX 中的 localeTechnical Q&A 1480
  • @contrabit 有没有可以参考的例子?因为这非常模糊,很难从中得出答案。
  • 我的本地日期和时间是 2016-03-13 20:50。我住在不列颠哥伦比亚省温哥华,这意味着时区-8。当前夏令时有效 (+1h)。从那开始:UTC = 20:50 + 8h - 1h = 27:50 = 第二天 03:50 = 2016-03-14 03:50。现在在谷歌中输入“UTC时间”并检查是否正确。

标签: swift


【解决方案1】:

如果您使用的是 UIDatePicker,则以 UTC 格式获取选定的日期和时间非常简单。下面的第一行代码将返回所选时间 YYYY-MM-DD hh:mm:ss 第二行代码将返回自 1970 年 1 月 1 日凌晨 12:00 以来的时间间隔(以秒为单位)格林威治标准时间。

// Returns Selecteed Date //
datePicker.date

// Returns Seconds Since Jan. 1, 1970 //
datePicker.date.timeIntervalSince1970

但是,如果您不使用 UIDatePicker,则只需使用即可获得与上述代码返回的信息相同的信息:

//** Variable "pastDate" must be NSDate **//

// Returns Selected Date //
pastDate

// Returns Seconds Since Jan.1, 1970 //
pastDate.timeIntervalSince1970

编辑:

我想我明白你现在想要做什么,下面的代码应该以 UTC 形式返回用户选择的日期。

func UTCStringFromDate(date: NSDate) -> String {
    // Get User's Time //
    let calendar = NSCalendar.currentCalendar()
    // Get User's TimeZone Difference //
    let difference = calendar.timeZone.secondsFromGMT

    // Get UTC Time //
    let adjustedTime = calendar.dateByAddingUnit(.Second, value: -difference, toDate: date, options: [])!

    // Format Date //
    let dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
    return dateFormatter.stringFromDate(adjustedTime)
}

【讨论】:

  • 顺便说一句,首先不以任何特定格式返回它:它是NSDateyyyy-MM-dd HH:mm:ss Z(注意大小写)格式只是description 方法如何工作的函数。如果您想要字符串表示,则应始终使用 NSDateFormatterTechnical Q&A 1480
  • 谢谢@ZGski,我现在面临的问题是:使用datePicker,我允许用户选择时间和日期,拆分这些独立的NSDates,然后连接。从这里,我有一个用户选择的当地时间。现在,我如何将这个本地时间转换为 UTC?我将添加一个编辑以显示我到目前为止的内容
猜你喜欢
  • 1970-01-01
  • 2018-09-03
  • 2022-01-24
  • 2023-03-10
  • 2012-11-17
  • 1970-01-01
  • 1970-01-01
  • 2016-10-16
  • 2020-03-21
相关资源
最近更新 更多