Как получить понедельник 00:00 текущей недели? Swift 3

#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 установили), то функция вернет субботу на текущей неделе, то есть следующую субботу.