kcs*_*cks 6 date-formatting swift
我正在尝试格式化时间间隔。我想要一个看起来像这样的结果:
\n\n10:45 - 12:00 AM\nRun Code Online (Sandbox Code Playgroud)\n\n我可以使用以下方法非常接近这一点DateInvervalFormatter:
let cal = Calendar.current\nlet formatter = DateIntervalFormatter()\nformatter.dateStyle = .none\nformatter.timeStyle = .short\nlet start = Date()\nlet end = cal.date(byAdding: .hour, value: 1, to: start)\nformatter.string(from: DateInterval(start: start, end: end!))\nRun Code Online (Sandbox Code Playgroud)\n\n上面的内容(在 en_US 语言环境中)将产生如下输出:
\n\n5:27\xe2\x80\x89\xe2\x80\x93\xe2\x80\x896:27 PM\nRun Code Online (Sandbox Code Playgroud)\n\n看起来不错吧?但是,如果间隔中的两个日期位于不同日期,则此方法不起作用。例如:
\n\nlet formatter = DateIntervalFormatter()\nformatter.dateStyle = .none\nformatter.timeStyle = .short\nlet startComponents = DateComponents(year: 2020, month: 1, day: 1, hour: 23, minute: 45)\nlet start = cal.date(from: startComponents)\nlet end = cal.date(byAdding: .hour, value: 1, to: start!)\nformatter.string(from: DateInterval(start: start!, end: end!))\nRun Code Online (Sandbox Code Playgroud)\n\n尽管设置dateStyle为.none,上例中生成的字符串(在 en_US 语言环境中)为:
1/1/2020, 11:45 PM\xe2\x80\x89\xe2\x80\x93\xe2\x80\x891/2/2020, 12:45 AM\nRun Code Online (Sandbox Code Playgroud)\n\n我想要的是:
\n\n11:45 PM\xe2\x80\x89\xe2\x80\x93\xe2\x80\x8912:45 AM\nRun Code Online (Sandbox Code Playgroud)\n\n我怎样才能得到这个?我知道我可以使用 aDateFormatter将每个日期(开始和结束)格式化为一个时间,然后将两个字符串与-中间的连字符 ( ) 一起附加,但这不一定适合本地化。
我最终得到的是:
\nextension Date {\n \n func formatTimeInterval(\n to: Date,\n timeZone: TimeZone = .autoupdatingCurrent\n ) -> String {\n \n let formatter = DateIntervalFormatter()\n formatter.timeZone = timeZone\n formatter.timeStyle = .short\n formatter.dateStyle = .none\n \n // we need to manually strip any "date" metadata, because for some locales,\n // even if we set `formatter.dateStyle = .none`, if the dates are in two different days\n // we will still get the date information in the end result (e.g. for the US locale)\n \n let calendar = Calendar.current\n let fromComponents = calendar.dateComponents([.hour, .minute, .second], from: self)\n let toComponents = calendar.dateComponents([.hour, .minute, .second], from: to)\n let fromDate = calendar.date(from: fromComponents)!\n let toDate = calendar.date(from: toComponents)!\n return formatter.string(from: fromDate, to: toDate)\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n但是,如果间隔日期位于不同月份(例如 8 月 31 日 - 9 月 1 日),它会添加从第 1 年开始的日期,例如
\n1/1/1, 11:45 PM\xe2\x80\x89\xe2\x80\x93\xe2\x80\x891/2/1, 12:45 AM
仍然没有干净的解决方案......
\n