Как выразить текущее время словами

Я могу получить текущее время, теперь я хочу вывести его словами.

let date = Date()
let calendar = Calendar.current
let hour = calendar.component(.hour, from: date)
let minutes = calendar.component(.minute, from: date)
let seconds = calendar.component(.second, from: date)
print("hours = \(hour):\(minutes):\(seconds)")

Вывод

10:30

Как получить лайк –

Сейчас пол одиннадцатого


person Swift Developer    schedule 20.02.2017    source источник
comment
Что должно произойти во французской системе? В арабской системе?   -  person matt    schedule 20.02.2017
comment
Я тебя не понимаю @matt   -  person Swift Developer    schedule 20.02.2017
comment
где ты застрял? что вы пробовали?   -  person holex    schedule 20.02.2017
comment
Я не могу найти, как преобразовать 10:30 в объяснение грамматики, сейчас половина одиннадцатого   -  person Swift Developer    schedule 20.02.2017
comment
Это не то, что означает алфавитный порядок.   -  person Daniel Storm    schedule 20.02.2017
comment
К вашему сведению - Apple ничего не предоставляет для этого. Вам придется написать свой собственный код или найти стороннюю библиотеку.   -  person rmaddy    schedule 20.02.2017
comment
@matt,holex, Даниэль Сторм - Пожалуйста, проверьте обновленный вопрос   -  person Swift Developer    schedule 20.02.2017


Ответы (2)


Как указывает @MwcsMac в своем ответе, ключом к решению этой проблемы является Formatter (ранее известный как NSFormatter), в частности, путем установки .numberStyle на .spellOut.

Хотя это подберет текущую локаль (и, следовательно, язык), проблема в том, что многие другие языки, кроме английского, не используют ту же терминологию «половина прошедшего», «четверть до» - например, в немецком языке 10:30 «полуэльф», буквально «от половины (до) одиннадцати».

Написание кода, который предполагает, что языковой стандарт является английским/американским, является действительно плохой практикой и, вероятно, приведет к отклонению приложения, если оно будет предлагаться за пределами этих областей, так что лучший вариант действительно может сделать формат "10:30" как "десять тридцать", "zehn dreißig".

Код с извинениями @MwcsMac:

import Foundation

let date = Date()
let calendar = Calendar.current
let hour = calendar.component(.hour, from: date)
let minute = calendar.component(.minute, from: date)

func spell(_ number: Int, _ localeID: String) -> String {
    let formatter = NumberFormatter()
    formatter.numberStyle = .spellOut
    // Specify the locale or you will inherit the current default locale
    formatter.locale = Locale(identifier: localeID)
    if let s = formatter.string(from: NSNumber(value: number)) {
        // AVOID forced unwrapping at all times!
        return s
    } else {
        return "<Invalid>" // or make return optional and return `nil`
    }
}
spell(hour, "EN") + " " + spell(minute, "EN") // "nineteen thirty-three"
spell(hour, "FR") + " " + spell(minute, "FR") // ""dix-neuf trente-trois"
spell(hour, "AR") + " " + spell(minute, "AR") // "تسعة عشر ثلاثة و ثلاثون"
person Grimxn    schedule 20.02.2017
comment
Основываясь на этом коде. Что, если добавить let langStr = Locale.current.languageCode и получить spell(hour, langStr!) + " " + spell(minutes, langStr!)? Который будет обрабатывать передачу кода языка. - person MwcsMac; 20.02.2017
comment
Конечно, или (как это делает ваш код) вы можете игнорировать локаль, и по умолчанию будет Locale.current! Я просто добавил его, чтобы уточнить, что локаль важна, независимо от того, указана она или установлена ​​по умолчанию... - person Grimxn; 20.02.2017

Этот код покажет вам, что можно достичь конечной цели. Имейте в виду, как указано выше, вам нужно будет создать логику для комбинаций, которые вы хотите получить.

Свифт 3

let date = Date()
let calendar = Calendar.current
let hour = calendar.component(.hour, from: date)
let minutes = calendar.component(.minute, from: date)
let seconds = calendar.component(.second, from: date)

func spell(_ number: Int) -> String {
    let formatter = NumberFormatter()
    formatter.numberStyle = .spellOut // This will convert the number to words.
    return formatter.string(from: NSNumber(value: number))!
}

if minutes == 30 {
    let hourString = spell(hour)
    print("It's half past \(hourString)")
} 

Это может быть способ, которым вы будете использовать диапазон для временных рамок.

if case 1 ... 14 = minutes {
     let hourString = spell(hour) // This will give your hour in word form
     let minString = spell(minutes) // This will give your minutes in word form
     print("It's \(minString) past \(hourString)")
}
person MwcsMac    schedule 20.02.2017
comment
Это полезный ответ, но вам действительно нужно его привести в порядок. Что делает let numberAsNumber = Int(number), когда number уже Int? Почему ложное let formatter = в пункте if? Что произойдет, если minutes <= 30??? И, пожалуйста, комментируйте, что вы делаете! - person Grimxn; 20.02.2017
comment
Я не знаю никого, кто считал бы все 15-29 минут первого часа четвертью первого. - person rmaddy; 20.02.2017