2017-02-01 1 views
0

У меня есть «время» (часы и минуты), хранящиеся в объекте DateComponents, и мне нравится преобразовывать его в локализованный строковый формат, такой как 20:40, och 20:40 и т. Д.Как преобразовать объект DateComponents в локализованную строку, например «20:40 PM», без указания года, месяца и дня?

I теперь, как отобразить объект Date (NSDAte) таким образом, но для преобразования 20:40 в Date я должен притворяться, что знаю год, месяц и день.

Вопрос: Можно ли преобразовать DateComponents-объект в локализованной строки, такие как «08:40 PM», используя TimeZone- и Locale-объект, но без указания года, месяца, и День?

+1

Я не думаю, что вам даже потребуется TimeZone, вы можете делать все преобразования с Locale, если знаете исходный формат даты и желаемого формата. Установка языкового стандарта с автоматическим переводом даты в локализованную строку даты –

+0

@MSU_Bulldog, я согласен с тем, что TimeZone должен быть избыточным. – ragnarius

ответ

1

Вы можете просто получить сегодняшние компоненты и добавить к нему нужное время. Вам также необходимо указать календарь:

extension Date { 
    var era: Int { return Calendar.current.component(.era, from: self) } 
    var year: Int { return Calendar.current.component(.year, from: self) } 
    var month: Int { return Calendar.current.component(.month, from: self) } 
    var day: Int { return Calendar.current.component(.day, from: self) } 
} 

extension DateComponents { 
    var todaysDateFromTimeComponents: Date? { 
     let today = Date() 
     return DateComponents(calendar: Calendar.current, era: today.era, year: today.year, month: today.month, day: today.day, hour: hour, minute: minute).date 
    } 
} 

let date = DateComponents(hour: 20, minute: 40).todaysDateFromTimeComponents // "Feb 1, 2017, 8:40 PM" 

Если вы хотите отобразить «информацию о дате в данной временной зоне» вы должны использовать DateFormatter для форматирования даты.

extension DateFormatter { 
    convenience init(timeStyle: DateFormatter.Style) { 
     self.init() 
     self.timeStyle = timeStyle 
    } 
} 

extension Date { 
    static let shortTimeFormatter = DateFormatter(timeStyle: .short) 
    func shortTime(with timeZone: TimeZone) -> String { 
     Date.shortTimeFormatter.timeZone = timeZone 
     return Date.shortTimeFormatter.string(from: self) 
    } 
} 


date?.shortTime(with: TimeZone(identifier: "GMT")!) // 10:40 PM +2hs 
+0

Да, это может быть лучший ответ, но вы на самом деле указываете год, месяц и дату (на текущий). Возможно, эта информация должна быть включена (?) – ragnarius

+0

@ragnarius Я добавил также способ отображения соответствующего времени даты, просто передающего часовой пояс, который вы хотите отобразить –

1

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

var dateComponents = DateComponents() 
dateComponents.hour = 20 
dateComponents.minute = 40 

let date = Calendar.current.date(from: dateComponents) 

let dateFormatter = DateFormatter() 
dateFormatter.timeStyle = .short 
print(dateFormatter.string(from: date!)) // 8:40 PM 
+2

будьте осторожны с этим подходом. итоговая дата будет «0001-01-01 23:46:28 +0000» из-за года 0001. Например GMT GMT для моего местного будет GMT-03: 06: 28 «когда он должен быть GMT-03 : 00: 00 –

+0

Спасибо +1, я не знал, что у объекта Calendar был метод даты. – ragnarius

+0

Yea, @Leo Dabus, есть ли у вас альтернативное решение? – ragnarius

Смежные вопросы