Obtención de dates de inicio y finalización incorrectas de weekOfYear

let calendar = Calendar.current var dateComponents = DateComponents() dateComponents.weekday = calendar.firstWeekday dateComponents.weekOfYear = 2 dateComponents.year = 2017 let startOfWeek = calendar.date(from: dateComponents) let endOfWeek = calendar.date(byAdding: .day, value: 6, to: startOfWeek!) let formatter = DateFormatter() formatter.dateStyle = .short print(formatter.string(from: startOfWeek!)) print(formatter.string(from: endOfWeek!)) 

printing:

 1/8/17 1/14/17 

código de cambio:

 dateComponents.weekOfYear = 1 dateComponents.year = 2017 

printing:

 12/31/17 1/6/18 

¿Por qué es el 31/12/17?

¿alguien me lo dice? muchas gracias.

Cuando uso el estilo .full para imprimir las dates, recibo el domingo 31 de diciembre de 2017 para la primera date, pero obviamente está mal porque el 31 de diciembre es un jueves.

Si desea get la date correcta, use yearForWeekOfYear lugar de year . Documentos :

Puede usar la propiedad yearForWeekOfYear con las properties weekOfYear y weekday para get la date correspondiente a un día laborable en particular de una semana determinada de un año. Por ejemplo, el 6º día de la 53ª semana del año 2005 (ISO 2005-W53-6) corresponde al sábado 1 de enero de 2005 en el calendar gregoriano.

Alternativa, puedes ser un poco travieso y no escuchar los documentos y usar weekOfYear = 54:

 let calendar = Calendar.current var dateComponents = DateComponents() dateComponents.weekday = calendar.firstWeekday dateComponents.weekOfYear = 54 dateComponents.year = 2017 let startOfWeek = calendar.date(from: dateComponents) let endOfWeek = calendar.date(byAdding: .day, value: 6, to: startOfWeek!) let formatter = DateFormatter() formatter.dateStyle = .short print(formatter.string(from: startOfWeek!)) print(formatter.string(from: endOfWeek!)) 

Esto imprime:

 1/1/17 1/7/17 

que es casualmente, las dates correctas.