代码之家  ›  专栏  ›  技术社区  ›  Vyachaslav Gerchicov

根据swift或objective-c中的GMT计算到次日0.00的时间间隔?

  •  -2
  • Vyachaslav Gerchicov  · 技术社区  · 7 年前

    我试过这样的方法:

    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小时内达到的结果不同。如何解决此问题?

    2 回复  |  直到 7 年前
        1
  •  1
  •   Leo Dabus    7 年前

    首先创建 Calendar 适用于UTC时区。第二,获取 startOfDay using the UTC calendar. Third add one day to that date. Then you can use 日期 method timeIntervalSince(\uDate)`计算这两个日期之间的秒数:

    extension Calendar {
        static let iso8601UTC: Calendar = {
            var calendar = Calendar(identifier: .iso8601)
            calendar.timeZone = TimeZone(identifier: "UTC")!
            return calendar
        }()
    }
    

    extension Date {
        var secondsUntilStartOfDayTomorrowAtUTC: TimeInterval {
            return startOfDayTomorrowAtUTC.timeIntervalSince(self)
        }
        var startOfDayTomorrowAtUTC: Date {
            return Calendar.current.date(byAdding: .day, value: 1, to: startOfDayAtUTC)!
        }
        var startOfDayAtUTC: Date {
            return Calendar.iso8601UTC.startOfDay(for: self)
        }
    }
    

    操场测试:

    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
    
        2
  •  0
  •   Vyachaslav Gerchicov    7 年前

    例如,当我将小时设置为0时,它会根据GMT显示(在我的情况下,它是3小时的差值)。当我计算两个日期之间的差异时,两个日期都有相同的“位移”,所以最终结果应该是相同的