Swift转换字符串到日期输出错误的日期

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift转换字符串到日期输出错误的日期相关的知识,希望对你有一定的参考价值。

我想将dateStartString = “28/02/2018”转换为Date并将转换后的日期与今天的日期进行比较。当我转换dateStartString转换日期是"2018-02-27 18:30:00 UTC".why它的输出是错误的日期?

这是我的代码

var dateStartString = "28/02/2018"
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd/MM/yyyy"
guard let dateStartDate = dateFormatter.date(from: dateStartString) else {
    fatalError("ERROR: Date conversion failed due to mismatched format.")
}

let dateToday = Date()

if(dateStartDate>=dateToday){
    print("Yes")
}
else{
    print("Today date is 28/02/2018. Why it print No?")
}

希望你能理解我的问题。提前致谢。

答案

您需要了解Date不仅代表日期,还代表时间。

>=比较Date对象的日期和时间组件。由于您未在日期字符串中指定任何时间,因此API假定您在当地时间为00:00:00,即UTC中前一天的18:30:00。为什么选择UTC?这就是日期的description总是如此。打印日期时,它始终以UTC时间打印。要在您的时区中打印它,请设置日期格式化程序的timeZone属性并对其进行格式化。

仅比较日期组件的一种方法是删除时间组件。从这个answer,这是你删除时间组件的方式:

public func removeTimeStamp(fromDate: Date) -> Date {
    guard let date = Calendar.current.date(from: Calendar.current.dateComponents([.year, .month, .day], from: fromDate)) else {
        fatalError("Failed to strip time from Date object")
    }
    return date
}

现在这应该是真的:

dateStartDate >= removeTimeStamp(fromDate: dateToday)
另一答案

由于Sweeper explained, dateStartDate位于00:0028/02/2018,而dateToday是当前的时间点,即同一天,但是在午夜之后。因此,dateStartDate >= dateToday评估为false

仅将时间戳与日期粒度进行比较,并忽略可以使用的时间组件

if Calendar.current.compare(dateStartDate, to: dateToday, toGranularity: .day) != .orderedAscending {
    print("Yes")
}

如果dateStartDatedateToday相同或更晚,则会打印“是”。

比较方法返回.orderedAscending.orderedSame.orderedDescending,具体取决于第一个日期是在前一天,同一天或晚些时候,而不是第二个日期。

另一答案

尝试在比较日期时设置当前的dateFormatter。您的示例代码更新下方:

var dateStartString = "28/02/2018"
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd/MM/yyyy"
dateFormatter.locale = NSLocale.current
guard let dateStartDate = dateFormatter.date(from: dateStartString) else {
    fatalError("ERROR: Date conversion failed due to mismatched format.")
}

var dateToday = Date()
print(dateToday)
let dateTodaystr = dateFormatter.string(from: dateToday)
dateToday = dateFormatter.date(from: dateTodaystr)!
print(dateToday)

if(dateStartDate>=dateToday){
    print("Yes")
}
else{
    print("Today date is 28/02/2018. Why it print No?")
}
另一答案

你需要为你的timeZone dateFormatter

dateFormatter.timeZone = TimeZone(secondsFromGMT:0)!

以上是关于Swift转换字符串到日期输出错误的日期的主要内容,如果未能解决你的问题,请参考以下文章

Swift 日期格式化程序错误地转换/创建日期/字符串 [重复]

Swift - 将字符串转换为日期

Swift DateFormatter 错误地转换字符串日期/时间

无法将字符串转换为日期和日期转换为字符串 Swift 5.2

在 Swift 中从日期字符串转换日期

Java将日期转换为纪元值会产生错误的输出