【问题标题】:Date for the previous day @ 4am前一天的日期@凌晨 4 点
【发布时间】:2017-07-14 16:30:09
【问题描述】:

给定一个日期,我想在 4:00 获得一个日期。 0:00 - 3:39 失败:

let date3am = Calendar.current.date(from: DateComponents(year: 2017, month: 7, day: 1, hour: 3, minute: 0, second: 0))!

let date = Calendar.current.date(bySettingHour: 4, minute: 0, second: 0, of: 
date3am, direction: .backward)!

date // "Jul 1, 2017, 4:00 AM"
date < date3am // false

为什么date(bySettingHour) 不倒退?

【问题讨论】:

  • 不清楚您要达到的目标。我认为您有一个任意日期(例如date3am),并且您正试图获取该同一天的04:00的日期,对吗?
  • Calendar.current.date(bySettingHour: 4, minute: 0, second: 0, of: date3am, direction: .backward) 不会从date3am 中增加或减少 4 小时 - 即使它似乎应该这样做。它返回一个新的 Date 对象,该对象表示同一 calendar 日,带有新的 Time - 因此,“7 月 1 日凌晨 4 点”的结果 是 i> 正确。
  • @DonMag:我不想减去 4 小时,我想将时间设置为 4:00。但我不想去下一个凌晨 4 点,而是回到前一个(如果从 0:00-3:59 运行,那将是 1 天前)

标签: ios swift date calendar


【解决方案1】:

您使用了错误的方法。您需要使用日历方法nextDate(after date:),如下:

let date3am = Calendar.current.date(from: DateComponents(year: 2017, month: 7, day: 1, hour: 3, minute: 0, second: 0))!

if let date = Calendar.current.nextDate(after: date3am, matching: DateComponents(hour: 4, minute: 0, second: 0), matchingPolicy: .nextTime, repeatedTimePolicy: .first, direction: .backward) {
    date // "Jun 30, 2017, 4:00 AM"
    date < date3am // true
}

【讨论】:

  • 谢谢! bySettingHour 方法似乎与枚举方法具有相同的参数 - 但主要区别似乎是 nextDate 能够倒退。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-16
  • 2017-04-22
  • 1970-01-01
  • 2021-04-13
  • 1970-01-01
相关资源
最近更新 更多