【问题标题】:ios Swift Date without Timeios Swift 没有时间的日期
【发布时间】:2019-09-05 09:30:45
【问题描述】:

我试图只获取表示小时、分钟、秒为零的日期。这就是我正在尝试的

extension Date {

    var onlyDate: Date? {
        get {
            let calender = Calendar.current
            var dateComponents = calender.dateComponents([.year, .month, .day], from: self)
            dateComponents.timeZone = NSTimeZone.system
            return calender.date(from: dateComponents)
        }
    }

}

当我尝试时

date = Date().onlyDate 

它返回上一个日期。您可以查看屏幕截图,它给我的时间是 4 月 14 日,而应该是 15 日

【问题讨论】:

标签: ios swift nsdate nsdatecomponents


【解决方案1】:

让我猜猜,你是在 GMT+6 时区,不是吗?

当打印Dates 时,它们总是以 UTC 显示。

2019-04-14 18:00 UTC 与您当地时区的 2019-04-15 00:00 相同

您的代码没有错。它工作正常。

要在您的时区查看它,请使用 DateFormatter 并设置 timeZone 属性:

let formatter = DateFormatter()
formatter.timeStyle = .none
formatter.dateStyle = .full
formatter.timeZone = TimeZone.current
print(formatter.string(from: Date().onlyDate))

【讨论】:

  • 它适用于日期吗? formatter.date(from: yourDate) 将不起作用
  • 什么意思?请注意,Date 只是一个时间点。 2019-04-14 18:00 UTC2019-04-15 00:00 GMT+6 是同一时间点。您无需更改您的 Date 对象的任何内容。您只需要更改显示日期的方式。 @dineshsharma
  • extension Date { var onlyDate: Date { get { let calender = Calendar.current var dateComponents = calender.dateComponents([.year, .month, .day], from: self) let dateFormatter = DateFormatter () dateFormatter.dateFormat = "yyyy:MM:dd" let date = calender.date(from: dateComponents) let stringDate = dateFormatter.string(from: date!) print(stringDate) print(dateFormatter.date(from: stringDate) ) 返回 dateFormatter.date(from: stringDate)! } } }
  • 您可以通过以下方式运行它:- let date = Date().onlyDate 行。请尝试一下
  • 不,您不需要更改扩展程序中的任何内容。您的扩展程序是正确的。您从 Date().onlyDate 获得的 date 对象是正确的。问题在于你如何显示它。见编辑。 @dineshsharma
【解决方案2】:

日期是一个时间点。使其某些组件为零只能与给定的时区、日历结合使用。

你所做的看起来是正确的。但问题是您的调试器如何显示日期。它再次需要使用某个时区,日历可能与您的计算机(或设备)上的内容相匹配。

为了更有意义,假设我使用的是 UTC,但在 -1 中调试它。然后如果我创建一个日期15.4.2019 at 0:00:00 但调试它我会看到14.4.2019 at 23:00:00

所以Date 本身不是人类可读的。下面是我相信从 EPOCH 1.1.1970 UTC 开始计算秒数的双精度浮点值。您需要将日历和时区应用于Date 实例并使用格式化程序将其转换为您可以阅读的内容(如14.4.2019 at 23:00:00 中的内容是可读的)。如果日历或时区不同,那么结果也不会相同。因为在某些时候14.4.2019 at 23:00:0015.4.2019 at 0:00:00 在地球上的两个不同位置是完全相同的时刻。

【讨论】:

    猜你喜欢
    • 2015-04-13
    • 2016-02-07
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    • 2018-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多