Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
根据swift或objective-c中的GMT计算到次日0.00的时间间隔?_Swift_Date_Nsdate_Nstimeinterval - Fatal编程技术网

根据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日历获取开始日期。第三,再加上一天。然后可以使用Date
method
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