Date from date components is incorrect after changing month

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)