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)
使用设备的区域设置显示当前时区的日期。 dateStyle
和 timeStyle
参数让您可以选择是否显示日期或时间,以及以何种格式(短、中或长)显示。
ISO8601DateFormatter
显示日期遵循 ISO8601 标准中的约定。上面的 isoDateStringFromDate(:)
函数使用 .withInternetDateTime
选项以 ISO8601“互联网日期和时间”格式表示日期。我强迫那个日期在当地时区,所以它显示的日期与格林威治标准时间有 -4 小时的偏移(因为它是美国东部时间,我居住的东部夏令时。)
函数 dateStringFromDate(_:)
与您的函数略有不同。它 returns 当前时区的日期字符串,使用 12 小时制和 AM/PM 字符串。
我在 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)
使用设备的区域设置显示当前时区的日期。 dateStyle
和 timeStyle
参数让您可以选择是否显示日期或时间,以及以何种格式(短、中或长)显示。
ISO8601DateFormatter
显示日期遵循 ISO8601 标准中的约定。上面的 isoDateStringFromDate(:)
函数使用 .withInternetDateTime
选项以 ISO8601“互联网日期和时间”格式表示日期。我强迫那个日期在当地时区,所以它显示的日期与格林威治标准时间有 -4 小时的偏移(因为它是美国东部时间,我居住的东部夏令时。)
函数 dateStringFromDate(_:)
与您的函数略有不同。它 returns 当前时区的日期字符串,使用 12 小时制和 AM/PM 字符串。