如何用其他符号替换日期组成分隔符?

问题描述 投票:0回答:1

在我的应用程序中,我希望允许用户选择适合他们显示日期偏好的各种日期格式。但是,我不想定义固定的日期格式,因此我根据当前区域设置为不同组件获取最合适的格式。我了解不同的当地人可能使用不同的符号来分隔组件,但我想知道是否可以设置这些分隔符,同时保留适合该语言环境的组件的正确顺序。

例如,在美国,以下代码返回“09/06/2014”,但在英国它将是“06/09/2014”,我想保留该顺序,但用破折号或空格替换斜杠。但是我不相信我可以简单地解析返回的字符串并用其他字符替换“/”的实例,因为在某些语言环境中他们可能不使用“/”(我不确定,但似乎很有可能)。

NSDateFormatter.dateFormatFromTemplate("MMddyyyy", options: 0, locale: NSLocale.currentLocale())

是否可以在更改日期组件分隔符的同时获得最适合当前区域设置的格式?

ios swift nsdateformatter nslocale
1个回答
7
投票

我检查了所有可用的区域设置并检查了短日期格式,以确定到目前为止所有语言都使用这三个分隔符之一: / 。 -

因此,为了在保留格式的同时允许自定义分隔符,我只需将这些字符替换为自定义字符。例如:

dateFormatter.dateFormat = NSDateFormatter.dateFormatFromTemplate("MMddyyyy", options: 0, locale: NSLocale.currentLocale())
cell.dateLabel.text = dateFormatter.stringFromDate(NSDate())
cell.dateLabel.text = cell.dateLabel.text.stringByReplacingOccurrencesOfString("/", withString: " ", options: nil, range: nil)
cell.dateLabel.text = cell.dateLabel.text.stringByReplacingOccurrencesOfString(".", withString: " ", options: nil, range: nil)
cell.dateLabel.text = cell.dateLabel.text.stringByReplacingOccurrencesOfString("-", withString: " ", options: nil, range: nil)

我很高兴找到更好的解决方案。

这是我用来做出此决定的代码。它最终创建的分隔符集包含的分隔符多于实际分隔符,因为某些日期组件使用非数字但不是分隔符。另请注意,ar_SA 语言环境是唯一的,因为它有一个您可能认为是分隔符的字符实例,即阿拉伯逗号,但您可能不希望将其替换为给定其表示形式的自定义分隔符。

var delimitersSet = Set<Character>()
            
for identifier in Locale.availableIdentifiers {
    let locale = Locale(identifier: identifier)
                
    let dateFormatter = DateFormatter()
    dateFormatter.locale = locale
    dateFormatter.dateStyle = .short
                
    let shortDateFormat = dateFormatter.string(from: Date())
    let delimiters = Set(shortDateFormat.filter { !$0.isNumber })
    print("\(identifier): \(shortDateFormat): \(delimiters)")

    for delimiter in delimiters {
        if !delimitersSet.contains(delimiter) {
            print("Unique \(delimiter)")
        }
    }
    delimitersSet.formUnion(delimiters)
}
            
print("All possible date delimiters: \(delimitersSet)")
© www.soinside.com 2019 - 2024. All rights reserved.