Как отформатировать дату с помощью DateFormatter () - PullRequest
0 голосов
/ 03 июля 2019

Я пытался отформатировать время с помощью DateFormatter, но он продолжает возвращать ноль. Я знаю, что он не в правильном формате, поэтому я попытался отформатировать его в строке 5. Но код продолжает печатать с ошибкой.

        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "hh:mm a"

        dateFormatter.locale = Locale(identifier: "en_US_POSIX")
        let date = dateFormatter.date(from: "77000")
        if date != nil{
        print(dateFormatter.string(from: date!))
        }else{
            print("Error")
        }

1 Ответ

0 голосов
/ 04 июля 2019

Если у вас возникли проблемы с определением форматеров даты, полезно использовать его для преобразования объекта Date в String (с помощью функции DateFormatter string(from:).) Записывать результаты, изучать их и использовать то, что вы видите, чтобы выяснить, чем форматер даты отличается от желаемого формата даты.

В вашем случае у вас есть DateFormatter, который использует формат "чч: мм а". Поэтому ему нужны часы, двоеточие, минуты и символ AM / PM, например, «12:23 вечера».

Принимая ваш код:

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "hh:mm a"

dateFormatter.locale = Locale(identifier: "en_US_POSIX")

let dateString = dateFormatter.string(from: Date())
print(dateString)

И, запустив его на игровой площадке, мы получим вывод вроде:

05: 48 PM

Вы пытаетесь передать ей строку даты "77000". Вы говорите, что это «всего несколько секунд». Но ваш форматировщик даты не ожидает секунд. Ожидаются часы, минуты и символ AM / PM.

EDIT:

Я думаю, что нет способа конвертировать секунды в дату с помощью DateFormatter. Однако есть символ формата «А», который обозначает миллисекунды в день. Вы можете использовать это, но вам нужно умножить количество секунд на 1000.

Если вы хотите ввести дату в миллисекундах и преобразовать ее в часы, минуты и символ AM / PM, вам понадобится 2 средства форматирования даты: один для формата ввода и один для выходной формат. Ваш код может выглядеть так:

let inputFormatter = DateFormatter()
inputFormatter.dateFormat = "A"

let outputFormatter = DateFormatter()
outputFormatter.dateFormat = "hh:mm a"

outputFormatter.locale = Locale(identifier: "en_US_POSIX")

let dateString = outputFormatter.string(from: Date())
print(dateString)

guard let dateFromSeconds = inputFormatter.date(from: "77000000") else {
    fatalError("Can't convert '77000000' to a date")
}

let displayString = DateFormatter.localizedString(from: dateFromSeconds, dateStyle: .medium, timeStyle: .medium)
print("displayString = \(displayString)")

Редактировать # 2:

Однако, если вы хотите добавить количество секунд к сегодняшнему полуночи, я предлагаю другой подход. Класс Calendar имеет целый набор методов, которые позволяют выполнять «Календарные вычисления». В этом случае мы будем использовать date(byAdding:value:to:wrappingComponents:).

Этот код может выглядеть так (все еще используя outputFormatter из кода выше):

let calendar = Calendar.current

let midnight = calendar.startOfDay(for: Date()) //Get the date of midnight today, local time

if let newDate = calendar.date(byAdding: .second, value: 77000, to: midnight) {
    let output = outputFormatter.string(from: newDate)
    print("date using Calendar.date(byAdding:value:to:wrappingComponents) = \(output)")
}

Что дает:

дата с использованием Calendar.date (byAdding: value: to: wrappingComponents) = 21:23

...