FSCalendar select 天 select 前一天 23:00

FSCalendar select day selects previous day at 23:00

我在 Swift 应用程序中使用 FSCalendar,当用户 select 一天时,我正在打印 selected 的那一天,它会打印前一天,在 23:00。我不确定为什么以及如何解决这个问题。我在西班牙。也许这与您所在的位置和当地时间有关?

这就是我打印 selected 日的方式:

extension CalendarDataViewViewController: FSCalendarDataSource {    
    func calendar(_ calendar: FSCalendar, didSelect date: Date, at monthPosition: FSCalendarMonthPosition) {
        let df = DateFormatter()
        df.dateFormat = "yyyy-MM-dd hh:mm:ss"
        let now = df.string(from: date)
        logger.debug("Date: \(date)")
       
    }    
}

这就是我在 select 3 月 18 日打印的内容:

21:01:24.646  DEBUG CalendarDataViewViewController.calendar():258 - Date: 2021-03-17 23:00:00 +0000

您的代码创建一个日期格式化程序,使用该格式化程序将返回的日期转换为日期字符串,然后忽略它并简单地打印以 UTC 显示的日期。 (注意输出Date: 2021-03-17 23:00:00 +0000

将您的日志命令更改为:

    logger.debug("Date: \(now)")

顺便说一句,变量名 now 是保存用户选择的日期而不是当前日期的糟糕选择。

我建议将返回的日期参数 selectedDate 和格式化程序的 String 输出重命名为 selectedDateString


编辑:

考虑这段代码:

import Foundation

func dateStringFromDate(_ inputDate: Date) -> String {
    let df = DateFormatter()
    df.dateFormat = "yyyy-MM-dd hh:mm:ss a"
    let dateString = df.string(from: inputDate)
    return dateString
}

func isoDateStringFromDate(_ inputDate: Date) -> String {
    let df = ISO8601DateFormatter()
    df.formatOptions = .withInternetDateTime
    df.timeZone = TimeZone.current //Force the formatter to express the time in the current time zone, including offset
    let dateString = df.string(from: inputDate)
    return dateString
}

let now = Date()
print("Current timezone = \(TimeZone.current)")
print("now in 'raw' format = \(now)")
let localizedDateString = DateFormatter.localizedString(from: now,
                                                        dateStyle: .medium,
                                                        timeStyle: .medium)
print("localizedString for the current date = \(localizedDateString)")
print("dateStringFromDate = \(dateStringFromDate(now))")
print("isoDateStringFromDate = \(isoDateStringFromDate(now))")

现在,大约在美国东部时间 3 月 18 日星期四下午 9:16,记录以下内容:

Current timezone = America/New_York (current)
now in 'raw' format = 2021-03-19 01:16:52 +0000
localizedString for the current date = Mar 18, 2021 at 9:16:52 PM
dateStringFromDate = 2021-03-18 09:16:52 PM
isoDateStringFromDate = 2021-03-18T21:16:52-04:00

'raw' 日期格式为 GMT,偏移值为 0。在该格式中,在 GMT 中,日历日期已经是 3 月 19 日。 (因为 GMT 比 EDT 早 4 小时)

class 函数 NSDateFormatter.localizedString(from:dateStyle:timeStyle) 使用设备的区域设置显示当前时区的日期。 dateStyletimeStyle 参数让您可以选择是否显示日期或时间,以及以何种格式(短、中或长)显示。

ISO8601DateFormatter 显示日期遵循 ISO8601 标准中的约定。上面的 isoDateStringFromDate(:) 函数使用 .withInternetDateTime 选项以 ISO8601“互联网日期和时间”格式表示日期。我强迫那个日期在当地时区,所以它显示的日期与格林威治标准时间有 -4 小时的偏移(因为它是美国东部时间,我居住的东部夏令时。)

函数 dateStringFromDate(_:) 与您的函数略有不同。它 returns 当前时区的日期字符串,使用 12 小时制和 AM/PM 字符串。