#ios #swift #date #swift3
#iOS #swift #Дата #swift3
Вопрос:
Я пытаюсь вернуть понедельник 00:00 с моей даты. Это мой код:
func getMonday(myDate: Date) -> Date {
let cal = Calendar.current
let comps = cal.dateComponents([.weekOfYear, .yearForWeekOfYear], from: myDate)
let beginningOfWeek = cal.date(from: comps)!
return beginningOfWeek
}
Моя проблема в том, что он возвращает не понедельник 00:00, а субботу 22:00.
Пример:
let monday1 = getMonday(myDate: date) //date is: 2016-10-04 17:00:00
print(monday1) //Prints: 2016-10-01 22:00:00 (Saturday)
Мой вопрос:
Как вернуть понедельник 00:00 из myDate
?
Большое вам спасибо.
Комментарии:
1. При печати даты всегда используется GMT, поэтому я предполагаю
2016-10-01 22:00:00 0000
, что на самом деле результат находится2016-10-02 00:00:00
в вашем часовом поясе, то есть в воскресенье.Calendar
имеетfirstWeekday
свойство, которое определяет, какой день считается первым на неделе, возможно, вам придется установить для него значение 2 = понедельник.
Ответ №1:
Ваш код возвращает первый день данной недели, это может быть воскресенье или понедельник (или, возможно, какой-то другой день), в зависимости от вашего региона.
Если вы хотите, чтобы понедельник считался первым рабочим днем, установите
cal.firstWeekday = 2
Если вам нужен понедельник данной недели, независимо от того, какое
начало недели, затем установите comps.weekday = 2
:
func getMonday(myDate: Date) -> Date {
let cal = Calendar.current
var comps = cal.dateComponents([.weekOfYear, .yearForWeekOfYear], from: myDate)
comps.weekday = 2 // Monday
let mondayInWeek = cal.date(from: comps)!
return mondayInWeek
}
Обратите внимание, что при печати a Date
всегда используется часовой пояс GMT,
вам понадобится средство форматирования даты, чтобы распечатать результат в соответствии с вашим местным часовым поясом. Пример:
let df = DateFormatter()
df.dateFormat = "yyyy-MM-dd HH:mm"
let now = Date()
print(df.string(from: now)) // 2016-10-02 20:16
let monday1 = getMonday(myDate: now)
print(df.string(from: monday1)) // 2016-09-26 00:00
Комментарии:
1. Обнаружена небольшая опечатка. Правильное имя переменной — «firstWeekday», а не «firstWeekday».
2. Вы устанавливаете значение
cal.firstWeekday
, но вы не устанавливаете это значениеgetMonday()
. Я считаю, что это приводитgetMonday()
к неправильной работе кода. Из моих тестов вам нужно как установить значениеcal.firstWeekday
, так иcomps.weekday
.3. @ThomasW: Возможно, я плохо выразился. С помощью настройки
cal.firstWeekday
вы управляете тем, что календарь считает первым днем недели. В качестве примера,cal.firstWeekday = 7
для субботы (а не для настройкиcomps.weekday
) функция вернет предыдущую субботу (сегодня четверг). С другой стороны, если вы установилиcomps.weekday = 7
(но неcal.firstWeekday
установили), то функция вернет субботу на текущей неделе, то есть следующую субботу.