为什么 Date() 和 Calendar.current.startOfDay(for: Date()) 产生不同的日期?

问题描述 投票:0回答:1

我正在尝试存储用户操作的

Date
数据,并将其设置为始终在一天开始时,无论用户何时执行该操作,即用户可以执行 30 个不同的操作,并且所有这些都存储在同一个
Date
.

然而,以下结果会产生奇怪的结果(在撰写本文时是 6 月 29 日),但出于某种原因,日历

.startOfDay
会产生 28 日?

print(Date())
print(Calendar.current.startOfDay(for: Date()))

// 2024-06-29 14:30:18 +0000
// 2024-06-28 21:00:00 +0000

有没有办法确保尊重同一天?

后续,我尝试了这个替代方案,它产生了相同的结果(28)

let calendar = Calendar.current
var components = calendar.dateComponents([.year, .month, .day], from: date)
components.hour = 0
components.minute = 0
components.second = 0
return calendar.date(from: components) ?? .now
ios swift date
1个回答
0
投票

Date
是一种命名非常糟糕的类型。它与日期无关,而且它的
description
(打印时看到的内容)只会通过暗示它可能使事情变得更糟。
Date
是时间上的一个瞬间,与位置或日历无关。它没有时区(需要位置)。这不是“某一天”(需要日历)。

.startOfDay
28 日不会返回。它返回您所在时区的 29 号 请注意,打印的
description
采用 UTC。您可能在 UTC+3 中运行它。如果你想锻炼一天,你想使用
DateComponents
,配置正确的
Calendar
TimeZone
,而不是看
Date
的“仅用于调试”字符串格式。

© www.soinside.com 2019 - 2024. All rights reserved.