Swift日期时间类Calendar
Swift日期时间类Calendar

Swift日期时间类Calendar

在 Swift 中,Calendar 是 Foundation 框架中的一个类,用于表示一个日期时间系统,例如公历(Gregorian)、农历(Chinese Lunar)、伊斯兰历(Islamic)等。它主要用于管理时间和日期的操作,例如日期的计算、提取日期组件、比较日期等。

Calendar 的核心功能

1、管理日期与时间

提取日期组件(例如年、月、日、小时等)。

计算两个日期之间的差异。

操作日期(如添加天数、月份等)。

2、支持不同的历法

默认是公历(Gregorian),但可以配置其他历法。

3、结合 Date 和 DateComponents 使用

Date:表示一个具体的时间点。

DateComponents:表示日期和时间的组成部分(例如年、月、日、小时等)。

Calendar 的创建

默认日历

默认使用当前用户设备设置的日历:

let calendar = Calendar.current

指定类型的日历

如果需要特定类型的日历(例如公历或农历),可以直接指定:

let gregorianCalendar = Calendar(identifier: .gregorian)    // 公历
let chineseCalendar = Calendar(identifier: .chinese)    // 农历
let islamicCalendar = Calendar(identifier: .islamic)    // 伊斯兰历

常见的操作示例

1、提取日期组件

可以提取 Date 的特定部分,例如年份、月份、日期等:

let now = Date()
let calendar = Calendar.current

let year = calendar.component(.year, from: now)   // 当前年份
let month = calendar.component(.month, from: now) // 当前月份
let day = calendar.component(.day, from: now)     // 当前日期
let hour = calendar.component(.hour, from: now)   // 当前小时
let minute = calendar.component(.minute, from: now) // 当前分钟
let second = calendar.component(.second, from: now) // 当前秒

print("Year: \(year), Month: \(month), Day: \(day)")

常见的 Calendar.Component 枚举值

以下是一些常用的日期组件:

1).year:年

2).month:月

3).day:日

4).hour:小时

5).minute:分钟

6).second:秒

7).weekday:星期几(1 代表周日,依次递增)

8).weekdayOrdinal:当前周内的顺序,比如第几周的第几天

9).quarter:当前年份的季度

10).weekOfMonth:当前月的第几周

11).weekOfYear:当前年的第几周

2、添加时间(日期偏移)

使用 Calendar 可以对日期进行加减操作,例如添加天数、月份等:

let now = Date()
let calendar = Calendar.current

if let nextWeek = calendar.date(byAdding: .day, value: 7, to: now) {
    print("Next week: \(nextWeek)")
}

if let nextMonth = calendar.date(byAdding: .month, value: 1, to: now) {
    print("Next month: \(nextMonth)")
}

3、计算两个日期之间的差异

使用 Calendar 可以计算两个日期之间的时间差。

let startDate = Date()
let endDate = Calendar.current.date(byAdding: .day, value: 5, to: startDate)!

let diff = Calendar.current.dateComponents([.day, .hour], from: startDate, to: endDate)
print("Difference: \(diff.day ?? 0) days, \(diff.hour ?? 0) hours")

4、判断日期的某些特性

例如,判断某一天是否是周末:

let today = Date()
let calendar = Calendar.current

let isWeekend = calendar.isDateInWeekend(today)
print("Is today a weekend? \(isWeekend)")

5、获取一周的起始日期

使用 startOfDay(for:) 获取某一天的开始时间,或获取当前周的起始日期:

let now = Date()
let startOfToday = Calendar.current.startOfDay(for: now)
print("Start of today: \(startOfToday)")

if let startOfWeek = Calendar.current.dateInterval(of: .weekOfMonth, for: now)?.start {
    print("Start of the week: \(startOfWeek)")
}

6、获取和设置时区

获取当前时区

可以通过 Calendar 对象的 timeZone 属性来获取当前的时区。默认情况下,Calendar.current 使用的是系统时区(通常是本地时区)。

let calendar = Calendar.current
let timeZone = calendar.timeZone
print("Current time zone: \(timeZone.identifier)") // 获取当前时区的标识符

设置时区

可以通过修改 Calendar 的 timeZone 属性来改变该日历使用的时区。例如,设置时区为 UTC(协调世界时):

let calendar = Calendar.current
var newCalendar = calendar
newCalendar.timeZone = TimeZone(abbreviation: "UTC")! // 设置为 UTC 时区

let currentDate = Date()
let utcDate = newCalendar.date(bySettingHour: 10, minute: 0, second: 0, of: currentDate)

print("Date in UTC: \(utcDate!)")

Calendar 的核心属性和方法

属性

1、.current:当前设备用户的日历设置(一般是公历)。

2、.identifier:当前日历的类型标识符(如 .gregorian)。

3、.timeZone:当前日历使用的时区。

4、.firstWeekday:一周的第一天(1 通常表示周日)。

方法

1、component(_:from:):提取某个日期的特定组件,例如年、月、日、小时等。

2、date(byAdding:to:):对日期进行加减操作,例如增加天数、月份等。

3、dateComponents(_:from:):提取多个日期组件,例如同时获取年、月、日。

4、dateComponents(_:from:to:):计算两个日期之间的差异。

5、isDate(_:inSameDayAs:):判断两个日期是否在同一天。

6、isDateInWeekend(_:):判断某个日期是否是周末。

7、startOfDay(for:):获取某个日期的开始时间(零点)。

8、dateInterval(of:for:):获取某个时间单位(如一周、一月)的起始和结束时间。

9、isDateInToday(_:):判断某个日期是否是今天。

10、isDateInTomorrow(_:):判断某个日期是否是明天。

11、range(of:in:):获取某个单位(如日、月等)在一个范围的内的最大值/最小值。

12、ordinality(of:in:for:):返回一个日期在某个单位(如月、周等)中的序数。

13、date(bySetting:value:of:):根据指定的日期成分(如年、月、日等)设置新的日期。

常见应用场景

1、日期和时间的格式化显示

2、倒计时计算

3、提醒功能的实现

4、与本地化时间相关的处理

总结

Calendar 是日期和时间管理的核心工具,支持复杂的日期操作和计算。

它结合了 Date 和 DateComponents,能实现从简单的日期提取到复杂的时间计算等多种功能。

常用方法包括 component(_:from:), date(byAdding:to:), isDate(_:inSameDayAs:),在 Swift 开发中非常重要。

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注