在尝试获取特定月份的第一天时,我遇到了与Calendar API有些奇怪的事情。
import Foundation
//2017-12-01 23:00:00 +0000
let date = Date(timeIntervalSinceReferenceDate: 533862000.0)
let secondDate = Calendar.current.date(bySetting: .day, value: 2, of: date)
let thirdDate = Calendar.current.date(bySetting: .day, value: 1, of: date)
print("Passed")
在Swift 4 Playground中,右侧的属性观察者显示date
和secondDate
的值,但在评估let thirdDate = ...
表达式时进入无限循环。
活动指标报告99%的CPU使用率和RAM使用率增加大约+ 100MB /秒,在iOS项目中运行时,XCode中的Debug Navigator也是如此(直到应用程序在大约1.3GB的RAM使用率下被杀死)< / p>
这并非适用于所有日期,但与此特定date
一致。
我已经浏览了Calendar
的文档,但我无法弄清楚为什么会发生这种情况。
我想出了一个像这样的解决方法:
let date = Calendar.current.startOfDay(for: someDate)
var dc = Calendar.current.dateComponents([.month, .year, .day], from: date)
dc.day = 1
let firstDayOfMonth = Calendar.current.date(from: dc)
但是我非常希望得到一个解释,为什么Calendar.current.date(bySetting: .day, value: 1, of: date)
失败了。我在这里错过了什么吗?
编辑:它发生在时区GMT + 2,但如果我将系统设置更改为GMT + 1则不会再出现。