Время форматирования дня Стриж Утро / День / Вечер / В любое время
Я пытаюсь найти способ получить время дня на словах. Очевидно, есть простой способ сделать это Приложение для отображения утром, вечером, если вы в порядке со статическими словами на одном языке. Есть ли способ сделать это в зависимости от локали? 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
, Это отформатирует дату в относительную дату в правильной локали.
Если форматировщик даты использует относительное форматирование даты, где это возможно, он заменяет компонент даты в своих выходных данных фразой, такой как "сегодня" или "завтра", которая обозначает относительную дату. Доступные фразы зависят от локали форматирования даты; в то время как для дат в будущем английский может разрешать только "завтра", французский может разрешать "послезавтра", как показано в следующем примере.
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