【问题标题】:Constructing date from Int the right way以正确的方式从 Int 构造日期
【发布时间】:2019-02-05 01:32:14
【问题描述】:

所以我从后端得到这个答案:

{ "SERVERDateTimeGet": { "Return Code" : 0,
    "Return String" : "No Error",
    "Year" : 2018,
        "Month" : 8,
        "Day" : 29,
        "Hour" : 14,
        "Minute" : 16,
        "Second" : 20,
        "Daylight" : 1,
        "NTP" : 0,
        "NtpDhcp" : 0,
        "NtpServers" : "time.google.com",
        "Timezone" : "EET-2EEST,M3.5.6/0:01,M9.1.5" }
 }

(我知道这很糟糕,非常糟糕,但就目前而言,这就是我得到的)

我有这个方法:

func makeDate(year: Int, month: Int, day: Int, hr: Int, min: Int, sec: Int) -> Date {
    let calendar = Calendar(identifier: .gregorian)
   // calendar.timeZone = TimeZone.current
    let components = DateComponents(year: year, month: month, day: day, hour: hr, minute: min, second: sec)
    //let components = DateComponents(timeZone: TimeZone.current, year: year, month: month, day: day, hour: hr, minute: min, second: sec)
    return calendar.date(from: components)!
}

但是当我得到日期时,它是 3 小时后的。 我认为这是因为时区,但如您所见,我没有使用时区。 有没有其他方法来构建日期或只使用当前的整数?

【问题讨论】:

  • 您所说的“日期早于 3 小时”是什么意思?您是如何发现 3 小时的差异的?请编辑问题并为makeDate 调用提供参数
  • 您的代码在操场上运行良好。检查您对该方法的输入。
  • 如果您没有设置时区,则使用默认设备时区。
  • 如果你没有设置TimeZone,这意味着你的时间将是UTC,所以你有-3小时的差距。要获得正确的值,您需要配置 TimeZone。你可以在这里查看stackoverflow.com/questions/1862905/nsdate-convert-date-to-gmt
  • @gaRik 谢谢,你是对的。我只需要在当地时间。你想把它写成答案吗?

标签: swift date nsdate nsdatecomponents


【解决方案1】:

如果您不设置 TimeZone,这意味着您的时间将以 UTC 为单位,因此您有 -3 小时的时间差。要获得正确的值,您需要配置 TimeZone。你可以查看here

【讨论】:

  • 这解释了为什么我总是在 3 小时前拿到它。我从您提供的链接中执行了该方法: func toLocalTime() -> Date { let timezone = TimeZone.current let seconds = TimeInterval(timezone.secondsFromGMT(for: self)) return Date(timeInterval: seconds, since: self) }就像一个魅力:) 谢谢!
猜你喜欢
  • 2020-09-01
  • 2021-06-11
  • 2014-09-29
  • 1970-01-01
  • 2012-12-30
  • 2019-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多