如何使用ISO 8601和RFC 3339的格式标准生成日期时间戳?
目标是一个如下所示的字符串:
"2015-01-01T00:00:00.000Z"
Run Code Online (Sandbox Code Playgroud)
格式:
最佳案例:
我搜索过StackOverflow,Google,Apple等,并没有找到Swift的答案.
似乎最有前途的类NSDate,NSDateFormatter,NSTimeZone.
相关问答:如何在iOS中获得ISO 8601日期?
这是迄今为止我提出的最好的:
var now = NSDate()
var formatter = NSDateFormatter()
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
formatter.timeZone = NSTimeZone(forSecondsFromGMT: 0)
println(formatter.stringFromDate(now))
Run Code Online (Sandbox Code Playgroud) 我有一个标签,以12小时格式显示当前时间.
但是,每次分钟/小时更改时,它都不会更新/刷新时间.
我需要它在时间变化时自动将标签更改为当前时间.
我创建了一个行程生成应用程序,要求用户输入他/她的旅行日期。唯一的问题是,使用 UIDatePicker 时,日期始终作为给定日/月/年的当前时间给出。
在一个单独的文件中,我扩展了 Date 类来尝试编写一个简单的方法,该方法将返回给定日期的午夜。
首先我尝试过
var midnight:Date{
let cal = Calendar(identifier: .gregorian)
return cal.startOfDay(for: self)
}
Run Code Online (Sandbox Code Playgroud)
然而,这总是给我 04:00 或 05:00,具体取决于夏令时,这给了我一个想法,我应该根据夏令时简单地删除 4 或 5 小时,因此我创建了以下方法:
var timezone:TimeZone{
return TimeZone.current
}
///Returns the first instance of the date, e.g. 2018-02-26 00:00:00
var trueMidnight:Date{
let cal = Calendar(identifier: .gregorian)
let midnight = cal.startOfDay(for: self)
let secondsFromGMT = TimeZone.current.secondsFromGMT()
print("Daylight savings? \(daylightSavings)")
return midnight.addingTimeInterval(Double(secondsFromGMT))
}
///If this var returns true, then daylight savings time is active and an hour of daylight is …Run Code Online (Sandbox Code Playgroud) 如果您的iOS设备设置为使用默认为12小时制的区域(例如美国),并且您具有如下DateFormatter设置:
var dateFormatter: DateFormatter = {
let formatter = DateFormatter()
formatter.dateFormat = "h:mm a"
return formatter
}()
Run Code Online (Sandbox Code Playgroud)
然后,它会输出,如果“24小时时间”开关接通的24小时格式的时间ON的日期和时间设置在iOS中。
如果您的自定义日期格式为“ H:mm”(即24小时),而您仍处于默认的12h区域,则无论24小时开关的打开/关闭状态如何,它都将输出24小时时间。
好的,很好,很简单,我将使用“ h:mm a”,然后用户将根据自己喜欢的格式看到显示的任何时间。但是,如果您将区域更改为默认情况下使用24小时制的区域,则行为会相反!如果您具有“ H:mm”并且24小时制时间开关处于OFF位置,它将更改为12小时制(“ h:mm a”)。
是的,通常可以通过使用时间样式(formatter.timeStyle = .short例如,)而不是使用自定义日期格式来避免这种情况,但是如果您需要自定义日期格式并且要遵守用户的设置,应该怎么办?(例如,如果您需要在字符串中插入一些自定义字符,或者只是想按非标准顺序使用组件)
我想在这里也要吃蛋糕的唯一方法是提前检查用户的喜好(据我所知,您实际上不能直接做)或语言环境的默认设置是(我虽然看不到任何方法来做),然后相应地调整格式…
我做了这个Xcode项目,以更清楚地演示该问题(显然,它必须在设备上运行,因为模拟器上没有24小时切换)。
我知道有各种各样的解决方法,但是如果您要制作的应用程序使用自定义日期/时间格式作为UI并具有来自世界不同地区的用户,那么我不希望Apple期望您做什么。我是否缺少某些东西,或者这是iOS中的缺陷?
注意:此问题专门用于将日期转换为字符串以供显示,因此,我希望尽可能遵守用户的语言环境和其他设置。我知道您可以将语言环境设置为en_POSIX等,但这不能解决问题。我也希望尽可能地做到无缝,并充分利用内置的功能,但这似乎不可能实现,除非您仅将目标用户设置为具有相同默认24小时制的地区…
我有一个扩展设置,String以相同的格式返回当前日期,以便可以调用代码中的任何位置并使用相同的格式,从而保持一致性.我的代码是
extension String {
static let dateString = DateFormatter.localizedString(from: Date(), dateStyle: .short, timeStyle: .short)
}
Run Code Online (Sandbox Code Playgroud)
唯一的问题是,当我调用它时,返回相同的确切时间,直到应用程序被杀死.如果我正在使用Date()那么它每次都应该使用新的价值,对吧?为什么不是这样?
假设您有一个全局的日期格式化程序
let df:DateFormatter = DateFormatter()
Run Code Online (Sandbox Code Playgroud)
理想情况下.dateFormat,在相同的全局初始化时间进行设置会很好- 有点像这样
let df:DateFormatter = DateFormatter().dateFormat = "yyyy-MM-dd"
Run Code Online (Sandbox Code Playgroud)
但是DateFormatter没有替代的初始化(没有像这样的东西DateFormatter(withDateFormat: "yyyy-MM-dd"))
真的,有一个Swift解决方案吗?是否存在任何类之外的代码块的语法,它可以在任何类型之前运行,并且可以在其中设置这种性质的东西?
(注意 - 我完全了解替代方法,如单例,扩展等:这是一个Swift结构问题,谢谢.)
我有一个时区String类型,我想在 Swift 4 中的这个时区获取日期(带格式dd:mm:yyyy)和时间(带格式hh:mm:ss)。我该怎么做?
我看过日历库,但我不明白如何查看它来解决我的问题。