Swift中iOS Date类值与预期日期字符串不符的问题求助
解决JTAppleCalendarView中Date值与预期日期不一致的问题
这其实不是JTAppleCalendar的内部错误,而是日期时区处理导致的常见问题,我来帮你理清原因并给出修复方案~
问题根源
首先要明确:Date类型本质上是一个时间戳,本身不携带时区信息。当你直接print(date)时,系统默认会以UTC时区输出它的字符串表示;而你的dateTimeString()方法应该是用了本地时区进行格式化,所以才会出现两种看似矛盾的日期显示:
- UTC时间
2018-05-31 15:00:00 +0000,对应你本地时区(比如东9区,韩国时区)的2018-06-01 00:00:00——这正是你预期的日期。 - 你看到的
Jun 1, 2018 at 12:00:00 AM,就是本地时区的正确显示结果。
修复方案
你可以通过以下几种方式获取符合预期的日期输出:
1. 给日期格式化器指定时区
修改你的代码,在设置dateFormat后,明确指定格式化器的时区(本地时区或UTC,根据需求选择):
func calendar(_ calendar: JTAppleCalendarView, didSelectDate date: Date, cell: JTAppleCell?, cellState: CellState) { let formatter = DateFormatter() formatter.dateFormat = "yyyy MM dd" // 指定为本地时区,输出你预期的本地日期 formatter.timeZone = TimeZone.current print("The selecting part") print(date) // 仍会显示UTC时间,但格式化后的结果正确 print(formatter.string(from: date)) // 输出:2018 06 01 }
如果需要UTC时区的日期,只需把TimeZone.current替换为TimeZone(identifier: "UTC")即可。
2. 通过Calendar提取本地日期组件
如果你需要的是本地时区的Date对象(而非字符串),可以用Calendar提取日期组件后重新构造:
func calendar(_ calendar: JTAppleCalendarView, didSelectDate date: Date, cell: JTAppleCell?, cellState: CellState) { let localCalendar = Calendar.current // 提取本地时区的年、月、日组件 let components = localCalendar.dateComponents([.year, .month, .day], from: date) // 构造本地0点的Date对象 guard let localDate = localCalendar.date(from: components) else { return } print("Local date:", localDate) // 本地时区显示为2018-06-01 00:00:00 }
额外小技巧
JTAppleCalendar的CellState本身就提供了text属性(比如选中日期的"1"),结合当前的月份和年份,你也可以直接构造对应的日期字符串,完全避免时区混淆:
let selectedDay = cellState.text let selectedMonth = cellState.dateComponents.month let selectedYear = cellState.dateComponents.year print("Selected date: \(selectedYear!) \(selectedMonth!) \(selectedDay!)")
内容的提问来源于stack exchange,提问作者Seongmin Choo
相关产品推荐
相关产品推荐

