【问题标题】:What are the format specifiers allowed in iOS DateFormatter dateFormat fromTemplate?iOS DateFormatter dateFormat fromTemplate 中允许的格式说明符是什么?
【发布时间】:2019-08-01 03:19:54
【问题描述】:

我找不到DateFormatter.dateFormat(fromTemplate:options:locale:) 的模板参数中允许的格式说明符列表。

  1. dateFormat 引导我去...
  2. Date and Time Programming Guide。这些页面都没有列出格式说明符。所以我检查了建议的相关文档...
  3. Date and Time Programming Guide for Core Foundation 没有列表。
  4. Data Formatting Guide 有一个小节标题“使用格式字符串指定自定义格式”,但它只是让我回到上面的(1)。数据格式指南中的其他页面都没有格式说明符。

有谁知道 Apple 在哪里记录这些说明符?

【问题讨论】:

  • 嗯?它们链接到您提到的第四个标题正下方:“格式字符串使用 Unicode 技术标准 #35 中的格式模式。标准的版本因操作系统的版本而异:- OS X v10。 9 和 iOS 7 使用 version tr35-31。- OS X v10.8 和 iOS 6 使用 version tr35-25 ...".
  • 谢谢。我忽略了它(是的,甚至在页面顶部)。我正在寻找一个实际的表格 in Apple 文档,而不是对非 Apple 文档的引用。另外,它的开头是谈论 setDateFormat,而不是 dateFormat(fromTemplate...)

标签: ios nsdateformatter dateformatter


【解决方案1】:

我将通过一些示例扩展评论中的答案。对于 iOS 7 及更高版本,格式代码在这里:http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html#Date_Format_Patterns。表格太大,无法在这里全部复制,但这里有一些帮助我入门。有关所有格式和说明,请参见该链接。

  • 时代:G (AD), GGGG (Anno Domini)
  • 年份:y (1984), yy (84), yyyy (1984)
  • 月:M、MM、MMM、MMMM、MMMMM。还有:L
  • 一个月中的某天:d, dd
  • 星期几名称:E, EEEE, EEEEE, EEEEEE

这是我发现有助于探索这些的游乐场片段。

import Foundation

let components = DateComponents(
    calendar: Calendar(identifier: .gregorian), 
    timeZone: nil, 
    era: 1, 
    year: 1984, 
    month: 1, 
    day: 2, 
    hour: nil, minute: nil, second: nil, 
    nanosecond: nil, weekday: nil, 
    weekdayOrdinal: nil, quarter: nil, 
    weekOfMonth: nil, weekOfYear: nil, 
    yearForWeekOfYear: nil)
let aDate = Calendar(identifier: .gregorian).date(from: components)!
let en_US = Locale(identifier: "en_US")
var df = DateFormatter()
func formatdate(_ template: String) -> String {
    let custom = DateFormatter.dateFormat(fromTemplate: template, options: 0, locale: en_US)
    df.dateFormat = custom
    return df.string(from: aDate)
}

formatdate("Mdyyyy") // "1/2/1984"
formatdate("yyyyMMdd") // "01/02/1984"
formatdate("yyyyMMMdd") // "Jan 02, 1984"
formatdate("yyyyMMMMdd") // "January 02, 1984"
formatdate("yyyyMMMMMdd") // "J 02, 1984"
formatdate("yyyyG") // "1984 AD"
formatdate("yyyyGGGG") // "1984 Anno Domini"
formatdate("yyyyMMMddE") // "Mon, Jan 02, 1984"
formatdate("yyyyMMMddEEEE") // "Monday, Jan 02, 1984"
formatdate("yyyyMMMddEEEEE") // "M, Jan 02, 1984"

formatdate("MdYYYY") // "1/2/1984"
formatdate("YYYYMMdd") // "01/02/1984"
formatdate("YYYYMMMdd") // "Jan 02, 1984"
formatdate("YYYYMMMMdd") // "January 02, 1984"
formatdate("YYYYMMMMMdd") // "J 02, 1984"
formatdate("YYYYG") // "1984 AD"
formatdate("YYYYGGGG") // "1984 Anno Domini"
formatdate("YYYYMMMddE") // "Mon, Jan 02, 1984"
formatdate("YYYYMMMddEEEE") // "Monday, Jan 02, 1984"
formatdate("YYYYMMMddEEEEE") // "M, Jan 02, 1984"

【讨论】:

  • 你会想要使用yyyy 而不是YYYYstackoverflow.com/a/15133617/2108547
  • 哎呀。我感谢评论者发现了这个愚蠢的遗漏。固定的。我验证了这些特定示例的输出仍然相同。在 macOS 11.4 上使用 Xcode 13.0 beta (1) 验证。我会指出应该首先查看新的 Swift 5.5 格式化程序,因为它们完全避免格式化字符。在 14'30" 左右见 Date.formattedWhat's New in Foundation WWDC 2021
猜你喜欢
  • 1970-01-01
  • 2013-06-22
  • 2013-06-22
  • 1970-01-01
  • 2010-11-03
  • 2012-01-05
  • 2012-01-31
  • 2014-01-01
  • 2022-01-04
相关资源
最近更新 更多