Swift: получить локализованное отображение времени - с отдельным AM / PM в 12 часовых регионах - PullRequest
0 голосов
/ 17 октября 2018

Я хотел бы отобразить время текущей даты в UILabel в текущей локали.Предполагая, что текущее время будет 15:30 (отображение на 24 часа) / 15:30 (отображение на 12 часов).Теперь, если текущим языковым стандартом пользователя является 12 часов отображения, метка должна отображать только «3:30», а «PM» должна отображаться во второй метке.Я намеревался использовать

someDateTime = Date()
let df = DateFormatter()
df.locale = Locale.autoupdatingCurrent
df.timeStyle = .short
timeLabel.text =  df.string(from: someDateTime) // how without AM/PM ?
ampmLabel.text = "???" // how to show only in 12 hours regions?

Но в 12-часовых регионах он всегда идет с прикрепленным к нему AM / PM.Как я мог легко отличить эти случаи?

1 Ответ

0 голосов
/ 17 октября 2018

Одним из решений было бы создание строки времени из вашего средства форматирования даты, а затем посмотреть, содержит ли полученная строка либо amSymbol, либо pmSymbol средства форматирования даты.Если это так, сохраните этот символ и удалите его из строки даты.Тогда у вас будет две нужные вам строки.

let timeDF = DateFormatter()
timeDF.locale = ... // whatever you need of other than the user's current
timeDF.dateStyle = .none
timeDF.timeStyle = .short
var timeStr = timeDF.string(from: Date())
var ampmStr = ""
if let rng = timeStr.range(of: timeDF.amSymbol) {
    ampmStr = timeDF.amSymbol
    timeStr.removeSubrange(rng)
} else if let rng = timeStr.range(of: timeDF.pmSymbol) {
    ampmStr = timeDF.pmSymbol
    timeStr.removeSubrange(rng)
}

timeLabel.text = timeStr.trimmingCharacters(in: .whitespaces)
ampmLabel.text = ampmStr
...