Время форматирования дня Стриж Утро / День / Вечер / В любое время

Я пытаюсь найти способ получить время дня на словах. Очевидно, есть простой способ сделать это Приложение для отображения утром, вечером, если вы в порядке со статическими словами на одном языке. Есть ли способ сделать это в зависимости от локали? NSDateComponentsFormatter, похоже, не работает.

3 ответа

К сожалению, нет встроенного решения - относительное форматирование NSDateFormatter работает только на ежедневной основе.

Получи час с Calendar.current.component(.hour, from: Date()) и используйте переключатель диапазона и NSLocalizedString() локализовать строки.

Например:

// let hour = NSCalendar.currentCalendar().component(.Hour, fromDate: NSDate()) Swift 2 legacy
let hour = Calendar.current.component(.hour, from: Date())

switch hour {
case 6..<12 : print(NSLocalizedString("Morning", comment: "Morning"))
case 12 : print(NSLocalizedString("Noon", comment: "Noon"))
case 13..<17 : print(NSLocalizedString("Afternoon", comment: "Afternoon"))
case 17..<22 : print(NSLocalizedString("Evening", comment: "Evening"))
default: print(NSLocalizedString("Night", comment: "Night"))
}

Создать файл localizable.strings и добавьте нужные вам локализации.

Вот как я решил проблему с помощью Swift 2. Сначала я использовал эту статью для определения различных частей дня. Оттуда я использовал серию операторов if/else if. Мне любопытно, если кто-то еще может сделать это с помощью диапазонов.

//BIG PICTURE SOLUTION
//Step 1: Build a .plist or REST API service or whatever made up of different ways to describe "parts of the day" in different languages. 
//http://stackru.com/questions/3910244/getting-current-device-language-in-ios
//List of Language Codes: https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes
//Step 2: Get the user's local time zone
//Step 3: Calculate whether the user's local time fits within these buckets of time


import Foundation

class DayParts{
    var currentHour:Int
    var localLang:String?

    // IDEA: Build a .plist or a REST API service or whatever that simply returns a dictiontary
    let letterCodes:[String:Array<String>] = [
        "en": ["Early Morning", "Late Morning", "Early Afternoon", "Late Afternoon", "Evening", "Night"],
        "fr": ["Tôt le matin", "Tard dans la matinée", "Début d'après-midi", "Tard dans l'après-midi", "Soir", "Nuit"],
        "es": ["Mañana Temprano", "Mañana tarde", "Temprano en la tarde", "Fin de la tarde", "Anochecer", "Noche"]
    ]

    init(){
        //A. Get the current time
        let date = NSDate()
        let dateFormatter = NSDateFormatter()
            dateFormatter.dateFormat = "HH"
        //B. Get the current hour
        currentHour = Int(dateFormatter.stringFromDate(date))!
        //C. Get the current phone language
        localLang = NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode) as? String
    }

    func now() -> String {
        if(currentHour < 08){
            return letterCodes[localLang!]![0]
        }
        else if(currentHour < 11){
            return letterCodes[localLang!]![1]
        }
        else if( currentHour < 15){
            return letterCodes[localLang!]![2]
        }
        else if( currentHour < 17){
            return letterCodes[localLang!]![3]
        }
        else if(currentHour < 21){
            return letterCodes[localLang!]![4]
        }
        else{
            return "Night"
        }
    }
}

let dayParts = DayParts().now()

На самом деле, вы можете установить локаль в NSDateFormatter как это:

let df = NSDateFormatter()

df.locale = NSLocale.currentLocale()

Этот форматировщик даты поможет вам распечатать дату в currentLocale,

Но для того, что вы ожидаете, вам придется реализовать локализацию, чтобы получить локализованную строку из строк "Утро", "Полдень", "Ночь".

В лучшем случае вы можете сделать это со своей датой:

Есть недвижимость в NSDateFormatter - doesRelativeDateFormatting, Это отформатирует дату в относительную дату в правильной локали.

Из документации Apple:

Если форматировщик даты использует относительное форматирование даты, где это возможно, он заменяет компонент даты в своих выходных данных фразой, такой как "сегодня" или "завтра", которая обозначает относительную дату. Доступные фразы зависят от локали форматирования даты; в то время как для дат в будущем английский может разрешать только "завтра", французский может разрешать "послезавтра", как показано в следующем примере.

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.timeStyle = NSDateFormatterNoStyle;
dateFormatter.dateStyle = NSDateFormatterMediumStyle;
NSLocale *frLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"fr_FR"];
dateFormatter.locale = frLocale;

dateFormatter.doesRelativeDateFormatting = YES;

NSDate *date = [NSDate dateWithTimeIntervalSinceNow:60*60*24*3];
NSString *dateString = [dateFormatter stringFromDate:date];

NSLog(@"dateString: %@", dateString);
// Output
// dateString: après-après-demain
Другие вопросы по тегам