根据swift或objective-c中的GMT计算到次日0.00的时间间隔?
我试过这样的方法:根据swift或objective-c中的GMT计算到次日0.00的时间间隔?,swift,date,nsdate,nstimeinterval,Swift,Date,Nsdate,Nstimeinterval,我试过这样的方法: var calendar = Calendar.current var dayFutureComponents = DateComponents() dayFutureComponents.day = 1 // aka 1 day var d = calendar.date(byAdding: dayFutureComponents, to: Date()) ...//setting of d.hour, d.minute, d.second to zero and find
var calendar = Calendar.current
var dayFutureComponents = DateComponents()
dayFutureComponents.day = 1 // aka 1 day
var d = calendar.date(byAdding: dayFutureComponents, to: Date())
...//setting of d.hour, d.minute, d.second to zero and finding the difference between 2 dates
例如,问题是我当前的GMT是
+3
。因此,结果与我需要在3小时内达到的结果不同。如何解决此问题?遗漏了,例如,当我将小时设置为0时,它将根据GMT显示(在我的情况下,相差3小时)。当我计算两个日期之间的差异时——两个日期具有相同的“位移”,因此最终结果应该是相同的首先为UTC时区创建一个日历
。其次,使用UTC日历获取开始日期。第三,再加上一天。然后可以使用Datemethod
timeIntervalSince(udate)`计算这两个日期之间的秒数:
extension Calendar {
static let iso8601UTC: Calendar = {
var calendar = Calendar(identifier: .iso8601)
calendar.timeZone = TimeZone(identifier: "UTC")!
return calendar
}()
}
操场测试:
TimeZone.current.secondsFromGMT(for: Date()) / 3600 // -2 hours
Date().startOfDayAtUTC // "Jan 18, 2018 at 10:00 PM"
let finalDate = Date().startOfDayTomorrowAtUTC // "Jan 19, 2018 at 10:00 PM"
print(finalDate) // "2018-01-20 00:00:00 +0000\n"
let seconds = Date().secondsUntilStartOfDayTomorrowAtUTC // 29282.42592203617
let minutes = seconds / 60 // 488.0404320339362
let hours = seconds / 3600 // 8.134007200565604
这将在当地时间给出明天的开始时间。您仍然需要在UTC TimeZonekkk忍者编辑时使用日历。您忘记将
Date()
更改为self
您的原始评论使用的是Calendar.current
。解决方案是将日历时区设置为UTC。这两种方法都有效。我更喜欢将它们分开,以便有更多的灵活性(我可以在今天或明天得到),我不想挑剔。我删除了我的其他评论。@vadian没问题。请注意,它比看起来更复杂一些,如果你认为取决于时区和当前时间,你可以提前1天或落后。
TimeZone.current.secondsFromGMT(for: Date()) / 3600 // -2 hours
Date().startOfDayAtUTC // "Jan 18, 2018 at 10:00 PM"
let finalDate = Date().startOfDayTomorrowAtUTC // "Jan 19, 2018 at 10:00 PM"
print(finalDate) // "2018-01-20 00:00:00 +0000\n"
let seconds = Date().secondsUntilStartOfDayTomorrowAtUTC // 29282.42592203617
let minutes = seconds / 60 // 488.0404320339362
let hours = seconds / 3600 // 8.134007200565604