Начало дня (не сегодня) - PullRequest
       1

Начало дня (не сегодня)

0 голосов
/ 15 марта 2020

Я пытаюсь получить начало и конец дня. (Это может быть любой день, не обязательно сегодня)

Что я пробовал:

let input = "12/10/2018" // it could be any day
let formatter = DateFormatter()
formatter.dateFormat = "MM/dd/yyyy"
let date = formatter.date(from: input)
print(date!) // it prints: 2018-12-09 23:00:00 +0000
  • Почему в этом примере по умолчанию выводится 23?
  • Как я могу получить начало дня? (день и время UT C)
  • Как закончить этот день? (день и время по Гринвичу C)

(Во многих местах говорят о начале дня (). Например: Фильтр предиката базовых данных по сегодняшней дате

Но я спрашиваю о любом дне.)

Ответы [ 4 ]

2 голосов
/ 24 апреля 2020
let input = "12/10/2018"

let formatter = DateFormatter()
formatter.calendar = Calendar(identifier: .gregorian)
formatter.timeZone = TimeZone(identifier: "UTC")
formatter.dateFormat = "MM/dd/yyyy"

let startOfDate = formatter.date(from: input)
let dateIntervalDuration = formatter.calendar.dateInterval(of: .day,  for: startOfDate!)?.duration
let endOfDate = startOfDate?.addingTimeInterval(dateIntervalDuration! - 1)

print(startOfDate!)
print(endOfDate!)
0 голосов
/ 15 марта 2020

Используйте Calendar для вычисления даты:

let input = "12/10/2018" // it could be any day
let formatter = DateFormatter()
formatter.dateFormat = "MM/dd/yyyy"
formatter.timeZone = TimeZone(identifier: "UTC")

let date = formatter.date(from: input)!
print(date) // it prints: 2018-12-09 23:00:00 +0000

let calendar = Calendar.current
let nextDay = calendar.date(byAdding: .day, value: 1, to: date)!
print(nextDay)
0 голосов
/ 15 марта 2020

То, что большинство людей не знает (по крайней мере, я предполагаю это, потому что я не знал это до тех пор, пока go, когда мне пришлось столкнуться с этой самой проблемой), это то, что календарь может иметь часовой пояс , Поэтому, если у вас есть дата и время и вы настроили календарь .gregorian с определенным часовым поясом, например, UT C, теперь вы можете просто позвонить startOfDay(for:), и вы получите правильный ответ.

Например:

let tz = TimeZone.current
var greg = Calendar(identifier: .gregorian)
greg.timeZone = tz // or whatever
let d = Date() // or whatever
let start = greg.startOfDay(for: d)
print(start) // 2020-03-15 07:00:00 +0000

И это правильно: когда было 15:00 15 марта 2020 года по Гринвичу C в 7 часов утра, это было начало дня (полуночи), когда я находился в момент запуска этого код.

0 голосов
/ 15 марта 2020

Форматеры даты учитывают ваш часовой пояс. Функция print () этого не делает. Таким образом, результат «let date = ...» - это начало дня в вашем местном часовом поясе. Функция print () отображает дату и время в UT C. Вы на час впереди UT C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...