FSCalendar select day 选择前一天 23:00
Posted
技术标签:
【中文标题】FSCalendar select day 选择前一天 23:00【英文标题】:FSCalendar select day selects previous day at 23:00 【发布时间】:2021-03-18 20:02:01 【问题描述】:我在 Swift 应用程序中使用 FSCalendar,当用户选择一天时,我将打印所选日期,并且它会在前一天的 23:00 打印。我不确定为什么以及如何解决这个问题。我在西班牙。也许这与您所在的位置和您当地的时间有关?
这就是我打印所选日期的方式:
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)")
这就是我选择 18 March 时打印的内容:
21:01:24.646 ???? DEBUG CalendarDataViewViewController.calendar():258 - Date: 2021-03-17 23:00:00 +0000
【问题讨论】:
您当地的时区是什么? UTC+1?您在英国但现在有夏令时吗?当您打印数据时,它始终打印为 utc,而不是本地时间。如果您的当地时间比世界标准时间早 1 小时,那么您的日期是正确的。尝试打印now
。尝试打印date.description(with:Locale.current)
@Paulw11 现在打印 18 和日期 17,为什么?我在西班牙马德里时区。我需要使用正确的日期 18。如何更正错误的日期 17 并使用选择正确的第 18 天的日期?我的意思是,我怎样才能拥有像日期这样的日期对象,但日期正确?该字符串仅用于测试目的,我需要一个具有正确日期的对象来选择数据库中的事件。
您使用什么时区作为数据库中的日期?
因为时区。日期是一个固定的时间点。 “现在”对我来说是 19 日星期五 8 点 27 分,因为我在悉尼。对你来说,应该是 18 日 22:27,它是同一时间点。您应该始终只存储日期并在需要显示它时或在该时区很重要的任何其他时间转换为本地时间。
您可以使用Calendar
和DateComponents
获取相对于特定时区的一个月中的特定日期
【参考方案1】:
您的代码创建一个日期格式化程序,使用该格式化程序将返回的日期转换为日期字符串,然后忽略它并简单地打印以 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 左右,记录以下内容:
当前时区 = America/New_York(当前) 现在采用“原始”格式 = 2021-03-19 01:16:52 +0000 当前日期的本地化字符串 = 2021 年 3 月 18 日晚上 9:16:52 dateStringFromDate = 2021-03-18 09:16:52 PM isoDateStringFromDate = 2021-03-18T21:16:52-04:00
“原始”日期格式为 GMT,偏移值为 0。在该格式中,在 GMT 中,日历日期已经是 3 月 19 日。 (因为 GMT 比 EDT 早 4 小时)
类函数NSDateFormatter.localizedString(from:dateStyle:timeStyle)
使用设备的区域设置显示当前时区的日期。 dateStyle
和 timeStyle
参数让您可以选择是否以及以何种格式(短、中或长)显示日期或时间。
ISO8601DateFormatter
按照ISO8601 标准中的约定显示日期。上面的isoDateStringFromDate(:)
函数使用.withInternetDateTime
选项以ISO8601“互联网日期和时间”格式表示日期。我强制该日期在当地时区,因此它显示的日期与 GMT 有 -4 小时的偏移(因为它是 EDT,我居住的东部夏令时。)
函数dateStringFromDate(_:)
与您的函数略有不同。它返回当前时区的日期字符串,使用 12 小时时间和 AM/PM 字符串。
【讨论】:
现在打印 18... 为什么?你能解释一下为什么现在是 18 而日期是 17?我需要使用正确的日期 18。如何更正错误的日期 17 并使用选择正确的日期 18 的日期? 我的意思是,我怎样才能拥有像 date 这样的 Date 对象,但日期正确?该字符串仅用于测试目的,我需要一个具有正确日期的对象来选择数据库中的事件。 @NullPointerException 一个没有时区的日期。这只是一个时间点。根据您在全球的位置,它可能是不同的“日期”。将日期作为字符串存储在数据库中时,您通常会存储 UTC 日期描述,后跟其时区 (+0000) 或 (Z),这意味着相同(UTC / GMT 零秒) @NullPointerException 请注意,您的日期格式错误。您正在使用hh
(1-12 小时),没有上午信息。您应该使用HH
(0-23 小时)"yyyy-MM-dd HH:mm:ss"
。您还应该将时区添加到您的日期字符串中。通常的做法是使用带或不带小数秒的 ISO8601。你可以查看这个帖子date formatter ISO8601
深呼吸,听听我们在告诉你什么。函数调用Date()
的结果返回地球上任何地方的当前时刻的表示。它没有时区。该日期将采用不同的日历日,具体取决于您在哪个时区表示。例如,在美国东海岸,大约是 3 月 18 日星期四晚上 9:15。 (美东时间)。但是,在格林威治标准时间,星期五已经是凌晨 1:15。根据时区,完全相同的时刻有不同的日期。以上是关于FSCalendar select day 选择前一天 23:00的主要内容,如果未能解决你的问题,请参考以下文章