2016-12-09 9 views
8
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!)) 

druk:Pierwsze niepoprawne daty rozpoczęcia i zakończenia z weekOfYear

1/8/17 
    1/14/17 

kod zmiana:

dateComponents.weekOfYear = 1 
    dateComponents.year = 2017 

druk:

12/31/17 
    1/6/18 

dlaczego 31.12.17?

ktoś mi powiedzieć? Dziękuję bardzo.

+0

try bez krótkich formatów, wydrukować pełną datę –

+0

użyj [ 'yearForWeekOfYear'] (https://developer.apple.com/reference/foundation/datecomponents/1779818-yearforweekofyear) zamiast 'year' podczas pracy z' weekOfYear'. – user28434

+0

dziękuję bardzo – 7owen

Odpowiedz

7

Kiedy używam stylu .full, aby wydrukować daty, otrzymuję niedzielę, 31 grudnia 2017 r. Na pierwszą datę, ale jest to oczywiście błędne, ponieważ 31 grudnia to czwartek. Aby uzyskać poprawną datę, należy użyć yearForWeekOfYear zamiast year. Docs:

Można użyć właściwości yearForWeekOfYear z weekOfYear i właściwości codzienne uzyskać datę odpowiadającą konkretnym dniu tygodnia w danym tygodniu roku. Na przykład szósty dzień 53. tygodnia roku 2005 (ISO 2005-W53-6) odpowiada sob 1 stycznia 2005 r. W kalendarzu gregoriańskim.

Alternatywa, możesz być trochę niegrzeczny i nie słuchać docs i używać 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!)) 

Drukuje:

1/1/17 
1/7/17 

co jest przypadkiem, poprawne daty .

+0

dziękuję bardzo – 7owen

+1

@ 7owen Jeśli uważasz, że moja odpowiedź odpowiada na twoje pytanie, rozważ zaakceptowanie tego klikając ten znacznik wyboru! – Sweeper

Powiązane problemy