Ios Swift将字符串转换为日期输出错误的日期

Ios Swift将字符串转换为日期输出错误的日期,ios,swift,date,swift3,Ios,Swift,Date,Swift3,我想将中的dateStartString=“28/02/2018”转换为Date,并将转换后的日期与今天的日期进行比较。当我转换dateStartString时,转换的日期是“2018-02-27 18:30:00 UTC”。为什么它的输出是错误的日期 这是我的代码 var dateStartString = "28/02/2018" let dateFormatter = DateFormatter() dateFormatter.dateFormat = "dd/MM/yyyy" guard

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

这是我的代码

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
不仅表示日期,还表示时间

=
比较
日期
对象的日期和时间组件。由于您没有在日期字符串中指定任何时间,API假定它是本地时间的00:00:00,即UTC中前一天的18:30:00。你会问为什么是UTC?这就是日期的
描述
。打印日期时,它总是以UTC时间打印。要在时区中打印,请设置日期格式化程序的
时区
属性并格式化

仅比较日期组件的一种方法是删除时间组件。由此,您可以删除时间组件:

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)

对于
日期格式化程序
,您需要
时区

dateFormatter.timeZone = TimeZone(secondsFromGMT:0)!
由于
dateStartDate
是2018年2月28日的
00:00
, 而
dateToday
是当前时间点,即 在同一天,但在午夜之后。因此,
dateStartDate>=dateToday
的计算结果为
false

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

if Calendar.current.compare(dateStartDate, to: dateToday, toGranularity: .day) != .orderedAscending {
    print("Yes")
}
如果
dateStartDate
位于同一日期或更晚的日期,则将打印“是” 比今天的日期早一天

compare方法返回
.orderedAscending
.orderedAscending
, 或
.orderedDescending
,具体取决于是否启用了第一个日期
比第二个日期早一天、同一天或晚一天。

在复制日期时,尝试设置当前的日期格式化程序。 下面是您的示例代码更新:

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?")
}

你在哪个时区?谢谢。我知道了。工作正常