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?")
}
你在哪个时区?谢谢。我知道了。工作正常