【问题标题】:How to fix date formatter after adding 30 days to date添加 30 天后如何修复日期格式化程序
【发布时间】:2018-12-22 22:22:10
【问题描述】:

我将日期和时间转换为不同的字符串,并使用日期格式化程序将它们以日期格式组合在一起。在此之后,我将结果日期增加 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 天

【问题讨论】:

    标签: swift swift3 nsdate nsdateformatter


    【解决方案1】:

    这里有很多问题和很多不必要的代码。

    1. 在使用固定格式解析日期字符串时使用特殊的 en_US_POSIX 语言环境。
    2. 你不需要stringFromThityDaysBefore。在endingDate 30 天后,您的thirtyDaysBeforeToday 已经是Date
    3. 不要同时设置日期格式化程序的dateFormatdate/timeStyle。只设置一个。
    4. 最后,您需要一个新字符串来表示 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)
    

    02.11.16 的结果为 newDateString

    最后要考虑的一件事 - 不要在第二个日期格式化程序上使用 dateFormat。使用date/timeStyle。对于您希望向用户显示的任何日期,最好使用一种样式。这可确保其格式最适合用户的区域设置。

    【讨论】:

    • 感谢您的解释。你是对的,现在说得通了!
    猜你喜欢
    • 2022-11-23
    • 2019-10-19
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 2017-12-03
    • 2010-12-09
    • 2021-03-05
    • 1970-01-01
    相关资源
    最近更新 更多