添加 30 天后如何修复日期格式化程序
How to fix date formatter after adding 30 days to date
我正在将日期和时间放入不同的字符串中,并使用日期格式化程序以日期格式将它们组合在一起。在此之后,我将结果日期增加 30 天。现在我试图再次使用 dateFormatter 但无论我做什么都会导致 nil(即使它不是 nil)。我究竟做错了什么?
//GET TIME AND DATE FROM TWO STRINGS
var timeStarting = "10:50"
var dateStarting = "03/10/2016"
let date = Date()
let timeStamp = NSDate().timeIntervalSince1970
let dateFormater = DateFormatter()
dateFormater.dateStyle = .short
dateFormater.timeStyle = .none
dateFormater.dateFormat = "dd/MM/yyyy HH:mm"
var timeAndDate = "\(dateStarting) \(timeStarting)"
let endingDate : Date = dateFormater.date(from: "\(timeAndDate)")!
//ADD 30 DAYS TO ENDING DATE
var numberOfDays = "30"
let thirtyDaysBeforeToday = Calendar.current.date(byAdding: .day, value: Int(numberOfDays)!, to: endingDate)
var stringFromThityDaysBefore : String = "\(thirtyDaysBeforeToday!)"
//FORMAT AGAIN TO SHOW THE DATE IN AS (EX.: 13.10.2016)
let dateFormater2 = DateFormatter()
dateFormater2.isLenient = true
dateFormater2.dateStyle = .short
dateFormater2.timeStyle = .none
dateFormater2.dateFormat = "dd.MM.yy"
var newDates : Date = dateFormater2.date(from: "\(stringFromThityDaysBefore)")!
(结果示例:2016 年 10 月 13 日)- 结束日期后 30 天
这里有很多问题和很多不必要的代码。
- 在使用固定格式解析日期字符串时使用特殊的 en_US_POSIX 语言环境。
- 您不需要
stringFromThityDaysBefore
。在 endingDate
. 30 天后,您的 thirtyDaysBeforeToday
已经是 Date
- 不要同时设置日期格式化程序的
dateFormat
和 date/timeStyle
。只设置其中之一。
- 最后,您需要一个表示 30 天后的新日期的新字符串。您的代码失败是因为您使用字符串插值将
Date
转换为 String
,然后尝试使用第二个日期格式化程序解析该字符串。
固定代码如下:
let timeStarting = "10:50"
let dateStarting = "03/10/2016"
let dateFormater = DateFormatter()
dateFormater.dateFormat = "dd/MM/yyyy HH:mm"
dateFormater.locale = Locale(identifier: "en_US_POSIX")
let timeAndDate = "\(dateStarting) \(timeStarting)"
let endingDate = dateFormater.date(from: timeAndDate)!
//ADD 30 DAYS TO ENDING DATE
let numberOfDays = 30
let thirtyDaysAfter = Calendar.current.date(byAdding: .day, value: numberOfDays, to: endingDate)!
//FORMAT AGAIN TO SHOW THE DATE IN AS (EX.: 13.10.2016)
let dateFormater2 = DateFormatter()
dateFormater2.dateFormat = "dd.MM.yy"
let newDateString = dateFormater2.string(from: thirtyDaysAfter)
给出 newDateString
的 02.11.16
的结果。
最后要考虑的一件事 - 不要在第二个日期格式化程序上使用 dateFormat
。使用 date/timeStyle
。最好为您希望向用户显示的任何日期使用样式。这确保它的格式最适合用户的区域设置。
我正在将日期和时间放入不同的字符串中,并使用日期格式化程序以日期格式将它们组合在一起。在此之后,我将结果日期增加 30 天。现在我试图再次使用 dateFormatter 但无论我做什么都会导致 nil(即使它不是 nil)。我究竟做错了什么?
//GET TIME AND DATE FROM TWO STRINGS
var timeStarting = "10:50"
var dateStarting = "03/10/2016"
let date = Date()
let timeStamp = NSDate().timeIntervalSince1970
let dateFormater = DateFormatter()
dateFormater.dateStyle = .short
dateFormater.timeStyle = .none
dateFormater.dateFormat = "dd/MM/yyyy HH:mm"
var timeAndDate = "\(dateStarting) \(timeStarting)"
let endingDate : Date = dateFormater.date(from: "\(timeAndDate)")!
//ADD 30 DAYS TO ENDING DATE
var numberOfDays = "30"
let thirtyDaysBeforeToday = Calendar.current.date(byAdding: .day, value: Int(numberOfDays)!, to: endingDate)
var stringFromThityDaysBefore : String = "\(thirtyDaysBeforeToday!)"
//FORMAT AGAIN TO SHOW THE DATE IN AS (EX.: 13.10.2016)
let dateFormater2 = DateFormatter()
dateFormater2.isLenient = true
dateFormater2.dateStyle = .short
dateFormater2.timeStyle = .none
dateFormater2.dateFormat = "dd.MM.yy"
var newDates : Date = dateFormater2.date(from: "\(stringFromThityDaysBefore)")!
(结果示例:2016 年 10 月 13 日)- 结束日期后 30 天
这里有很多问题和很多不必要的代码。
- 在使用固定格式解析日期字符串时使用特殊的 en_US_POSIX 语言环境。
- 您不需要
stringFromThityDaysBefore
。在endingDate
. 30 天后,您的 - 不要同时设置日期格式化程序的
dateFormat
和date/timeStyle
。只设置其中之一。 - 最后,您需要一个表示 30 天后的新日期的新字符串。您的代码失败是因为您使用字符串插值将
Date
转换为String
,然后尝试使用第二个日期格式化程序解析该字符串。
thirtyDaysBeforeToday
已经是 Date
固定代码如下:
let timeStarting = "10:50"
let dateStarting = "03/10/2016"
let dateFormater = DateFormatter()
dateFormater.dateFormat = "dd/MM/yyyy HH:mm"
dateFormater.locale = Locale(identifier: "en_US_POSIX")
let timeAndDate = "\(dateStarting) \(timeStarting)"
let endingDate = dateFormater.date(from: timeAndDate)!
//ADD 30 DAYS TO ENDING DATE
let numberOfDays = 30
let thirtyDaysAfter = Calendar.current.date(byAdding: .day, value: numberOfDays, to: endingDate)!
//FORMAT AGAIN TO SHOW THE DATE IN AS (EX.: 13.10.2016)
let dateFormater2 = DateFormatter()
dateFormater2.dateFormat = "dd.MM.yy"
let newDateString = dateFormater2.string(from: thirtyDaysAfter)
给出 newDateString
的 02.11.16
的结果。
最后要考虑的一件事 - 不要在第二个日期格式化程序上使用 dateFormat
。使用 date/timeStyle
。最好为您希望向用户显示的任何日期使用样式。这确保它的格式最适合用户的区域设置。