Hello Eskimo, thank you for explaining. Your guess is correct: I am expecting date in the same year.
My main goal to create ClosedRange of dates to detect some date in that range and I need to manually set date components for that.
I've tried hardwire both Calendar and Timezone to gregorian and UTC respectively, but still have this issue. Reproduced it in Playground and in XCTestCase
Here's updated version:
var incorrectDate = Calendar.init(identifier: .gregorian).date(from: .init(calendar: .init(identifier: .gregorian), timeZone: .init(identifier: "UTC")!, year: 1960, month: 12, day: 18))!
var correctDate = Calendar.init(identifier: .gregorian).date(from: .init(calendar: .init(identifier: .gregorian), timeZone: .init(identifier: "UTC")!, year: 1960, month: 12, day: 17))!
var startDateComponents = Calendar.init(identifier: .gregorian).dateComponents(in: .init(identifier: "UTC")!, from: incorrectDate)
var dateFromComponents = startDateComponents.date
startDateComponents.month! = 1
var transformedDateComponents = startDateComponents
var transformedDateFromTransformedComponents = transformedDateComponents.date!
var changedComponents = Calendar.init(identifier: .gregorian).dateComponents(in: .init(identifier: "UTC")!, from: transformedDateFromTransformedComponents)
// Passing
assert(startDateComponents.year == transformedDateComponents.year)
// Failing with incorrect date
assert(transformedDateComponents.year == changedComponents.year)
assert(startDateComponents.year == changedComponents.year)