swift DateComponents

Posted ihoudf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了swift DateComponents相关的知识,希望对你有一定的参考价值。

作者:想聽丿伱說衹愛我
链接:https://www.jianshu.com/p/25b6c4527c64
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

一、简介

DateComponents是以可扩展的结构化方式封装日期的组件。它通过提供日期的部分来指定日期:时,分,秒,日,月,年等。它还可以用于指定持续时间,例如5小时16分钟。
可通过Calendar来将DateComponents转化为Date或将Date转化为DateComponents。

二、API

  1. 初始化
public init(calendar: Calendar? = nil, timeZone: TimeZone? = nil, era: Int? = nil,
            year: Int? = nil, month: Int? = nil, day: Int? = nil, hour: Int? = nil,
            minute: Int? = nil, second: Int? = nil, nanosecond: Int? = nil,
            weekday: Int? = nil, weekdayOrdinal: Int? = nil, quarter: Int? = nil, 
            weekOfMonth: Int? = nil, weekOfYear: Int? = nil, yearForWeekOfYear: Int? = nil)

calendar 日历
timeZone 时区
era 时代
year 年
month 月
day 日
hour 时
minute 分
second 秒
nanosecond 纳秒
weekday 一周的第几天,通常从周日开始为1,即周三为4。
weekdayOrdinal 本月的第几个weekday。若今天为周三,表示今天为本月的第几个周三,若本月是周四为1号,那么周三则是在上个月,虽然今天是第3周,但此处则为2。
quarter 季度,0-3 ,0表示12月1月2月。
weekOfMonth 本月第几周
weekOfYear 本年第几周
yearForWeekOfYear ISO8601标准下的年份。该标准一年有52或53周,在最后一周时,可能会出现该周属于2020年,但在ISO8601标准,该周属于2021年。

let dc = DateComponents(year: 2020, month: 12, day: 9,
         hour: 15, minute: 1, second: 2)
print(dc)
//year: 2020 month: 12 day: 9 hour: 15 minute: 1 second: 2 isLeapMonth: false 

可通过Calendar的dateComponents方法获取DateComponents
也可通过Calendar的date方法获取date

let dc = Calendar.current.dateComponents(in: TimeZone.current, from: Date())
print(dc)
//calendar: gregorian (current) timeZone: Asia/Shanghai (current) era: 1 year: 2020
//month: 12 day: 9 hour: 15 minute: 7 second: 12 nanosecond: 511075973 
//weekday: 4 weekdayOrdinal: 2 quarter: 0 weekOfMonth: 2 weekOfYear: 50 
//yearForWeekOfYear: 2020 isLeapMonth: false 
let d = Calendar.current.date(from: dc)
print(d)
//Optional(2020-12-09 07:07:12 +0000)
  1. 属性值
    calendar timeZone era year month day hour minute second nanosecond weekday weekdayOrdinal quarter weekOfMonth weekOfYear yearForWeekOfYear
    详见上面初始化方法
  • isLeapMonth
    本月是否为闰月
  • date
    日期组件表示的日期,日期组件的calendar不能为nil
let dc = Calendar.current.dateComponents(in: TimeZone.current, from: Date())
print(dc.date)
//Optional(2020-12-09 07:23:29 +0000)
  1. 属性值设置与获取
  • 设置
public mutating func setValue(_ value: Int?, for component: Calendar.Component)
public enum Component 
        case era
        case year
        case month
        case day
        case hour
        case minute
        case second
        case weekday
        case weekdayOrdinal
        case quarter
        case weekOfMonth
        case weekOfYear
        case yearForWeekOfYear
        case nanosecond
        case calendar
        case timeZone

此方法无法设置calendar和timeZone和isLeapMonth属性。

var dc = DateComponents(year: 2020, month: 1, day: 1)
dc.setValue(2021, for: .year)
等价于
dc.year = 2021
  • 获取
public func value(for component: Calendar.Component) -> Int?

此方法无法获取calendar和timeZone和isLeapMonth属性。

var dc = DateComponents(year: 2020, month: 1, day: 1)
print(dc.value(for: .year))
//Optional(2020)
print(dc.year)
//Optional(2020)
  1. 有效日期
  • 是否为calendar中存在的日期
public var isValidDate: Bool  get 

日期组件中必须存在calendar,否则会一直返回false

var dc = Calendar.current.dateComponents(in: TimeZone.current, from: Date())
print(dc.isValidDate)
//true
dc.day = 40
print(dc.isValidDate)
//false
  • 是否为指定calendar中存在的日期
public func isValidDate(in calendar: Calendar) -> Bool
var dc = DateComponents(year: 2020, month: 12, day: 22)
print(dc.isValidDate(in: Calendar.current))
//true
dc.day = 40
print(dc.isValidDate(in: Calendar.current))
//false

以上是关于swift DateComponents的主要内容,如果未能解决你的问题,请参考以下文章

swift DateComponents

swift DateComponents

swift DateComponents

swift DateComponents

Swift DateComponents 包含错误的小时值

如何正确使用TimeZone