【问题标题】:Difference between two dateTimes in seconds vary due to different time zones - Swift 3由于不同的时区,两个日期时间之间的差异(以秒为单位) - Swift 3
【发布时间】:2016-11-29 06:55:25
【问题描述】:

我需要找出当前时间(以秒为单位)和未来开始时间(以秒为单位从我的网络服务中获取)之间的差异。 我编写了以下代码:

    let currentTime = Int64(Date().timeIntervalSince1970)
    var time = Int64(timeArr[indexPath.row])

    print("\(currentTime) vs \(time)")
    time = time - currentTime
    print("difference in time : \(time)")

    let seconds = time % 60
    let minutes = (time / 60) % 60
    let hours = (time / 3600)

我的控制台显示了这个输出:

1480400929 vs 1480552620
difference in time : 151691

问题是我现在的时间是Tue Nov 29 2016 11:58:49,开始时间是2016-11-30 17:37:00,所以小时差应该是30小时左右,而不同时区的时间是42小时左右小时。我该如何解决?我已经经历了很多相同的问题,但没有任何效果。任何帮助,将不胜感激。

【问题讨论】:

  • NSDate 是一个绝对时间点,没有任何时区信息。 1480400929 是“2016 年 11 月 29 日 06:28:49 GMT”,1480552620 是“2016 年 12 月 1 日 00:37:00 GMT”。这些时间之间的差异约为 42 小时。 – 请解释您期望的结果以及为什么。
  • 我想要我当前时间(2016 年 11 月 29 日星期二 11:58:49)与我从服务器获取的开始时间 2016-11-30 17:37:00 之间的差异跨度>
  • 您是否将服务器时间作为字符串获取?你如何将该字符串转换为 NSDate?服务器时区是什么?你的时区是?
  • 是的,我将它作为毫秒形式的字符串作为 1480552620000。我通过上面提到的这一行将其转换为 int64:var time = Int64(timeArr[indexPath.row])。我的时区是 GMT + 5:30
  • 从服务器发送的时间戳 1480552620 是“2016-12-01 00:37:00 GMT”,即您的 GMT+5 中的“2016-12-01 06:07:00”: 30 时区,而不是“2016-11-30 17:37:00”

标签: swift datetime timezone swift3 date-difference


【解决方案1】:

如果您想要HoursMinutesseconds 中的两个日期之间的差异,您可以像这样使用DateComponent

let component = Calendar.current.dateComponents([.hour, .minute, .second], from: Date(), to: startDate)
let hours = component.hour ?? 0
let minutes = component.minute ?? 0
let seconds = component.second ?? 0

编辑:要从毫秒获取日期,请像这样使用Date(timeIntervalSince1970:)

let startDate = Date(timeIntervalSince1970: miliSeconds / 1000)

您也可以像这样使用DateFormatter 将字符串转换为日期。

let stringDate = "2016-11-30 17:37:00"
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
dateFormatter.timeZone = TimeZone(abbreviation: "GMT")
if let startDate = dateFormatter.date(from: stringDate) {
    print(startDate)
}

【讨论】:

  • 我以毫秒的形式获取我的 startDate,所以在这种情况下可以使用吗?
  • @Dia 在这种情况下,您可以获得像这样的开始日期let startDate = Date(timeIntervalSince1970: miliSeconds / 1000) 也检查编辑的答案。
  • let startDate = Date(timeIntervalSince1970: TimeInterval(timeArr[indexPath.row])) let component = Calendar.current.dateComponents([.hour, .minute, .second], from: Date() , to: startDate) let hours = component.hour ?? 0 让分钟 = component.minute ?? 0 让秒 = component.second ?? 0 我试过了。它仍然显示 42 小时
  • 我在 startDate 得到这个:2016-12-01 00:37:00 +0000
  • @Dia 我说的是 timeInterval 而不是日期,请告诉我你从那个数组中获取的 timeinterval 值
猜你喜欢
  • 2012-09-13
  • 1970-01-01
  • 1970-01-01
  • 2012-05-16
  • 2015-08-03
  • 2012-12-03
  • 2023-04-01
  • 1970-01-01
  • 2011-04-27
相关资源
最近更新 更多