美文网首页
NSDate的基本用法

NSDate的基本用法

作者: 骆小喵 | 来源:发表于2016-08-25 10:29 被阅读2580次

    1.NSDate对象转成格式化的字符串对象

    //通过 NSDate 获取当前日期
    let currentDate = NSDate()
    
    // NSDateFormatter 转换日期和字符串的工具
    let dateFormatter = NSDateFormatter()
    

    1.1 设置区域

    dateFormatter.locale = NSLocale.currentLocale()
    如果要设置日期为其他区域
    //比如设置成希腊
    dateFormatter.locale = NSLocale(localeIdentifier:"el_GR")
    

    1.2 设置日期格式
    有两种方式可以设置日期格式:一种是通过一些预定义的日期格式化样式(style);另外一种是通过某些说明符来手动设置日期格式。

    首先我们先使用 NSDateFormatterStyle 设置日期格式。
    
    //完整样式
    dateFormatter.dateStyle = NSDateFormatterStyle.FullStyle
    var convertedDate = dateFormatter.stringFromDate(currentDate)
    Tuesday, October 12, 2017
    
    //长样式
    dateFormatter.dateStyle = NSDateFormatterStyle.LongStyle
    convertedDate = dateFormatter.stringFromDate(currentDate)
    October 12, 2017
    
    //中长样式
    dateFormatter.dateStyle = NSDateFormatterStyle.MediumStyle
    convertedDate = dateFormatter.stringFromDate(currentDate)
    Otc 12,2017
    
    //短样式
    dateFormatter.dateStyle = NSDateFormatterStyle.ShortStyle
    convertedDate = dateFormatter.stringFromDate(currentDate)
    10/9/17
    

    使用日期说明符来设置日期格式

    EEEE:“星期”的全名(比如Monday)。如需缩写,指定1-3个字符(如E,EE,EEE代表Mon)。
    MMMM:“月份”的全名(比如October)。如需缩写,指定1-3个字符(如M,MM,MMM代表Oct)。
    dd:某月的第几天(例如,09或15)
    yyyy:四位字符串表示“年”(例如2015)
    HH:两位字符串表示“小时”(例如08或19)
    mm:两位字符串表示“分钟”(例如05或54)
    ss:两位字符串表示“秒”
    zzz:三位字符串表示“时区”(例如GMT)。缩写 Z
    GGG:公元前BC或公元后AD
    
    dateFormatter.dateFormat = "EEEE, MMMM dd, yyyy"
    convertedDate = dateFormatter.stringFromDate(currentDate)
    
    dateFormatter.dateFormat = "dd-MM-yyyy HH:mm"
    convertedDate = dateFormatter.stringFromDate(currentDate)
    

    2.将格式化的字符串通过date formatter转换成 NSDate 对象

    //示例1
    var dateAsString = "24-08-2016 10:49"
    dateFormatter.dateFormat = "dd-MM-yyyy HH:mm"
    var newDate = dateFormatter.dateFromString(dateAsString)
    //示例2
    dateAsString = "Thu, 08 Oct 2015 09:22:33 GMT"
    dateFormatter.dateFormat = "EEE, dd MMM yyyy HH:mm:ss zzz"
    newDate = dateFormatter.dateFromString(dateAsString)
    

    使用 NSDateComponents 还可以单独获取某一项的值,例如,星期、月份、时间、小时等。
    想要实现此功能呢,需要用到 NSCalendar 类 ,NSDateComponents 类经常和 NSCalendar 类搭配使用,NSCalendar 真正执行 NSDate 和 NSDateComponents 间的转换。这样,我们先要获取当前的calendar。

    let calendar = NSCalendar.currentCalendar()
    

    首先我们先来看一个 NSDate 到 NSDateComponents转换的具体例子

    let dateComponents = calendar.components([NSCalendarUnit.Day, NSCalendarUnit.Month,NSCalendarUnit.Year,NSCalendarUnit.WeekOfYear,NSCalendarUnit.Hour,NSCalendarUnit.Minute,NSCalendarUnit.Second,NSCalendarUnit.Nanosecond], fromDate: currentDate)
    print("day = \(dateComponents.day)", "month = \(dateComponents.month)", "year = \(dateComponents.year)",  "week of year = \(dateComponents.weekOfYear)", "hour = \(dateComponents.hour)",  "minute = \(dateComponents.minute)", "second = \(dateComponents.second)","nanosecond = \(dateComponents.nanosecond)" , separator: ", ", terminator: "")
    

    date components转换到date对象

    let components = NSDateComponents()
    components.day = 5
    components.month = 01
    components.year = 2016
    components.hour = 19
    components.minute = 30
    newDate = calendar.dateFromComponents(components)
    

    3.比较日期和时间

    首先先创建两个自定义的日期对象

    dateFormatter.dateFormat = "MMMM dd, yyyy zzz"
    dateAsString = "Oct 08, 2015 GMT"
    var date1 = dateFormatter.dateFromString(dateAsString)!
    
    dateAsString = "Oct 10. 2015 GMT"
    var date2 = dateFormatter.dateFromString(dateAsString)!
    

    第一种方法
    earlierDate: 判断一个日期是否早于另外一个日期
    laterDate: 判断一个日期是否晚于另外一个日期
    isEqualToDate:判断两个日期是否相等

    print("Earlier date is:\(date1.earlierDate(date2))")
    print("Later date is:\(date1.laterDate(date2))")
    print("dates is Same:\(date1.isEqualToDate(date2))")
    

    第二种方法
    NSDate 的 compare: 方法,它需要搭配使用 NSComparisonResult 枚举体

    
    if date1.compare(date2) == NSComparisonResult.OrderedDescending {
    
        print("Date1 is Later than Date2")
    } else if date1.compare(date2) == NSComparisonResult.OrderedAscending {
    
        print("Date1 is Earlier than Date2")
    } else if date1.compare(date2) == NSComparisonResult.OrderedSame {
    
        print("Same dates")
    }
    

    第三种方法
    计算每个日期到现在的时间间隔来判断

    if date1.timeIntervalSinceReferenceDate > date2.timeIntervalSinceReferenceDate {
        
        print("Date1 is Later than Date2")
    
    } else if date1.timeIntervalSinceReferenceDate < date2.timeIntervalSinceReferenceDate {
        
        print("Date1 is Earlier than Date2")
    
    } else {
    
        print("Same dates")
    
    }
    

    4.计算时间间隔

    首先自定义两个NSDate对象

    dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
    dateAsString = "2015-10-08 14:25:37"
    date1 = dateFormatter.dateFromString(dateAsString)!
    
    dateAsString = "2018-03-05 08:14:19"
    date2 = dateFormatter.dateFromString(dateAsString)!
    

    第一种方法
    使用 components:fromDate:toDate:options: ,第一个参数是 NSCalendarUnit 值的数组。这里要注意,如果第一个日期如果晚于第二个日期,则结果会返回负值。

    var diffDateComponents = NSCalendar.currentCalendar().components([NSCalendarUnit.Year,NSCalendarUnit.Month,NSCalendarUnit.Day,NSCalendarUnit.Hour,NSCalendarUnit.Minute,NSCalendarUnit.Second], fromDate: date1, toDate: date2, options: NSCalendarOptions.init(rawValue: 0))
    print("The difference between dates is: \(diffDateComponents.year) years, \(diffDateComponents.month) months, \(diffDateComponents.day) days, \(diffDateComponents.hour) hours, \(diffDateComponents.minute) minutes, \(diffDateComponents.second) seconds")
    

    剩下的两种方法都用到了 NSDateComponentsFormatter 类,它提供了多种用于自动计算日期间隔的方法,并可以返回格式化字符串结果。首先,我们创建一个date components formatter对象,这里只指定一个属性:

    let dateComponentsFormatter = NSDateComponentsFormatter()
    dateComponentsFormatter.unitsStyle = NSDateComponentsFormatterUnitsStyle.Full
    

    unitsStyle 属性指定我们使用的 dateComponentsFormatter 以何种格式打印日期的间隔。例如,这里我们使用 完整 样式,这样天数、月数等名字(如days,months)都会被显示出来。如果我们设置 缩写 样式,就会显示缩写名字(天数显示为d等)。你可以在 这个链接 中查找到所有的样式:让我们继续会到日期间隔计算的话题上。我们先计算日期的间隔,再把该值传递给stringFromTimeInterval:方法,这样,就能获得日期间隔的字符串表示:

    let interval = date2.timeIntervalSinceDate(date1)
    dateComponentsFormatter.stringFromTimeInterval(interval)
    
    

    最后,第三种计算的方法中,我们将两个日期传递给 NSDateComponentsFormatter 对象的一个叫 stringFromDate:toDate: 的方法。但是这个方法需要有个前置的条件:NSDateComponentsFormatter 的 allowedUnits 属性必须被提前设置,这个属性接受数组类型的值,这里至少要设置一个日历单元的值。否则这个方法会返回nil值。所以,在这个方法的使用中,我们“告诉”它需要获取哪些日历单元,它会按照对应的日历单元返回结果:

    dateComponentsFormatter.allowedUnits = [NSCalendarUnit.Year,NSCalendarUnit.Month,NSCalendarUnit.Day,NSCalendarUnit.Hour,NSCalendarUnit.Minute,NSCalendarUnit.Second]
    let autoFormattedDifference = dateComponentsFormatter.stringFromDate(date1, toDate: date2)
    

    感谢原作者的文章:这是一篇写给新手的NSDate教程(Swift版)

    相关文章

      网友评论

          本文标题:NSDate的基本用法

          本文链接:https://www.haomeiwen.com/subject/qwnnsttx.html