Преобразование строки времени в дату времени Unix того же дня

как преобразовать строковый час в миллисекунду дня?

например:

let strDate = "06:00 PM"

Or:

let strDate = "09:00 AM"

мой код:

let dateString = "06:00 PM"
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "HH:mm"
guard let date = dateFormatter.date(from: dateString)
else { fatalError() }
print(date)

например, моя строка: 18:00, поэтому я хочу иметь дату в миллисекундах сегодняшнего четверга, 20 сентября 2018 г., в 18:00.


person Community    schedule 20.09.2018    source источник
comment
Добро пожаловать в StackOverflow. Извините, но этот сайт не является службой написания кода. Отредактируйте свой вопрос и опубликуйте, что вы пробовали, и проблемы, с которыми вы столкнулись.   -  person Leo Dabus    schedule 20.09.2018
comment
Отредактировано........   -  person    schedule 20.09.2018
comment
ваш формат даты неверен HH для 24-часового формата   -  person Leo Dabus    schedule 20.09.2018


Ответы (2)


Вы можете установить дату по умолчанию для DateFormatter на startOfDay на сегодня, установить языковой стандарт форматирования на «en_US_POSIX» при анализе вашего времени, тогда вы можете просто получить полученную дату timeIntervalSince1970 и умножить на 1000:

let strTime = "06:00 PM"
let formatter = DateFormatter()
formatter.defaultDate = Calendar.current.startOfDay(for: Date())
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.dateFormat = "hh:mm a"
if let date = formatter.date(from: strTime) {
    let milliseconds = date.timeIntervalSince1970 * 1000
    print(milliseconds) // 1537477200000
    let date2 = Date(timeIntervalSince1970: milliseconds/1000)
    print(date2.description(with: .current))  // Thursday, September 20, 2018 at 6:00:00 PM Brasilia Standard Time
}
person Leo Dabus    schedule 20.09.2018
comment
Это будет включать в себя текущие секунды/наносекунды в разнице. Лучше установить formatter.defaultDate на начало текущего дня (как я упоминал выше). - person Martin R; 20.09.2018
comment
Есть проблема с часовым поясом, где я нахожу, что он возвращает мне результат в 15:00 вместо 18:00, почему? - person ; 20.09.2018
comment
@mickael вам нужно распечатать описание даты с указанием локали. Если вы хотите 18:00 UTC, вам нужно установить часовой пояс форматирования на zeroSecondsFromGMT. - person Leo Dabus; 20.09.2018

Во-первых, вам нужно проанализировать строку даты:

let dateString = "06:00 PM"
let formatter = DateFormatter()
formatter.defaultDate = Date()
formatter.dateFormat = "hh:mm a"
formatter.locale = Locale(identifier: "en_US_POSIX")
let date = formatter.date(from: dateString)

Затем вам нужно получить начало дня:

let calendar = Calendar.current
let start = calendar.startOfDay(for: date)

После этого получите временной интервал между date и start:

let timeInterval = date.timeIntervalSince(start)
let milliseconds = timeInterval * 1000.0
person Sweeper    schedule 20.09.2018
comment
Это нехорошо, возможно, вы не поняли, например, моя строка: 18:00, поэтому я хочу получить дату в миллисекундах сегодня, четверг, 20 сентября 2018 г., 18:00. - person ; 20.09.2018
comment
@mickael, вы имеете в виду время эпохи Unix для четверга, 20 сентября 2018 года, в 18:00 по местному времени? - person Leo Dabus; 20.09.2018
comment
@mickael Дата не включена во входную строку. Вы хотите предположить сегодня? - person Sweeper; 20.09.2018
comment
@Sweeper, если вы не установите для локали средства форматирования даты значение en_US_POSIX, это может привести к сбою, если локаль/настройки пользователя установлены на 24 часа - person Leo Dabus; 20.09.2018
comment
@LeoDabus Меня всегда привлекают местные особенности. Отредактировано. - person Sweeper; 20.09.2018