【问题标题】:swift 3 how to get date for tomorrow and yesterday ( take care special case ) new month or new year [duplicate]swift 3如何获取明天和昨天的日期(注意特殊情况)新月或新年[重复]
【发布时间】:2017-10-16 00:40:08
【问题描述】:

我正在处理每个当月的数据日历 我应该显示 3 种类型的计算(昨天 - 今天 - 明天)

由于特殊情况(索引超出范围)而导致崩溃 就像今天日期(2017 年 5 月 31 日) 如果我尝试继续我的应用程序并明天开始计算,我会有五月的数组,我将有错误(因为我明天应该知道它的新月份)

这是我的代码

class ViewController: UIViewController {
    var dateComponents: DateComponents!
    var TimeToday :[String] = []
    var TimeTomorrow :[String] = []
    var TimeYesterday :[String] = []
    override func viewDidLoad() {
        super.viewDidLoad()
        let dateDay = Date()
        let calendar = Calendar(identifier: .gregorian)
        dateComponents = calendar.dateComponents([.day, .month, .year], from: dateDay)
        done()
    }
    func done()  {
        //------ for tomorrow ------
        // month end day 31
        if (dateComponents.day! == 30){
            if(dateComponents.month! == 1 || dateComponents.month! == 4 || dateComponents.month! == 6 || dateComponents.month! == 7 || dateComponents.month! == 9 || dateComponents.month! == 11 ){
                TimeTomorrow.append("\(dateComponents.month!+1)")
            }
        // month end day 31
        }else if (dateComponents.day! == 31){
            if(dateComponents.month! == 3 || dateComponents.month! == 5 || dateComponents.month! == 8 ){
                TimeTomorrow.append("\(dateComponents.month!+1)")
            }else if(dateComponents.month! == 12){
                TimeTomorrow.append("\(dateComponents.year!+1)")
            }
         // month end day 29
        // special case for leap year i donot know how find it
        //****************************************************
            else if (dateComponents.day! == 29){
                if(dateComponents.month! == 2 || dateComponents.month! == 10  ){
                    TimeTomorrow.append("\(dateComponents.month!+1)")
                }
            }
        //------ for yesterday  ------
            if (dateComponents.month! == 12 || dateComponents.month! == 10 || dateComponents.month! == 8 || dateComponents.month! == 7 || dateComponents.month! == 5 || dateComponents.month! == 2){
                var day = dateComponents.date! - 1
                //fatal error: unexpectedly found nil while unwrapping an Optional value
                TimeYesterday.append("\(day)")
                TimeYesterday.append("30 - \(dateComponents.month! - 1)")
            }else {
                //////
            }
        }
    }
}

【问题讨论】:

标签: ios swift calendar


【解决方案1】:

我不知道这是否对您有帮助,但我建议不要在 NSDateComponents 上进行数学运算,而是在 NSDate 上进行。查看 https://github.com/malcommac/SwiftDate 一个 cocoapod,了解如何在 NSDate 上调用 tomorrow。该 pod 最酷的地方在于它使用 Regions,这有助于国际化,第二天可能从日落而不是午夜开始。

【讨论】:

    【解决方案2】:

    您应该使用日历方法date(byAdding component:) 在中午时间进行日历计算。这样做您无需担心那些特殊情况:

    Swift 3 或更高版本

    extension Date {
        static var yesterday: Date { return Date().dayBefore }
        static var tomorrow:  Date { return Date().dayAfter }
        var dayBefore: Date {
            return Calendar.current.date(byAdding: .day, value: -1, to: noon)!
        }
        var dayAfter: Date {
            return Calendar.current.date(byAdding: .day, value: 1, to: noon)!
        }
        var noon: Date {
            return Calendar.current.date(bySettingHour: 12, minute: 0, second: 0, of: self)!
        }
        var month: Int {
            return Calendar.current.component(.month,  from: self)
        }
        var isLastDayOfMonth: Bool {
            return dayAfter.month != month
        }
    }
    

    Date.yesterday    // "Oct 28, 2018 at 12:00 PM"
    Date()            // "Oct 29, 2018 at 11:01 AM"
    Date.tomorrow     // "Oct 30, 2018 at 12:00 PM"
    
    Date.tomorrow.month   // 10
    Date().isLastDayOfMonth  // false
    

    【讨论】:

    • Date().yesterday.month //错误如何打印下个月的月份数
    • 月份从何而来?
    • 您也可以扩展 Date 以从任何日期获取月份组件,但这是一个不同的问题
    • 这是一个很好的答案。虽然需要调整。 “今天”或“明天”的上下文总是存在的。所以要么: 1.将“今天”和“明天”变量更改为静态 2.将变量名称更改为“dayAfter”和“dayBefore” 3.两者。保留明天和今天,将它们设为静态并添加“dayAfter”和“dayBefore”作为实例变量。我认为这让事情变得更加清晰。
    • @LeoDabus 不错哈哈
    猜你喜欢
    • 2015-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-30
    相关资源
    最近更新 更多