Сбивающий с толку результат NSCalendar.dateFromComponents

Я пытаюсь получить текущую дату без часов и минут с помощью этого кода Swift:

let calendar = NSCalendar.currentCalendar()

let components = calendar.components(.CalendarUnitYear | .CalendarUnitMonth | .CalendarUnitDay, fromDate: NSDate())

println(components)

let date = calendar.dateFromComponents(components)

println(date)

Результат, который я получаю с println, меня немного сбивает с толку:

<NSDateComponents: 0x7fb5ad867700>
    Calendar Year: 2015
    Month: 7
    Leap month: no
    Day: 2

2015-07-01 22:00:00 +0000

components — это 2015-07-02, но полученный date — это 2015-07-01 22:00:00

Где моя ошибка?


Упомянутый с NSDateFormatter результат в порядке:

var dateFormatter = NSDateFormatter()

dateFormatter.dateStyle = NSDateFormatterStyle.LongStyle
dateFormatter.timeStyle = NSDateFormatterStyle.ShortStyle

println(dateFormatter.stringFromDate(date!))

Результат:

July 2, 2015 at 12:00 AM

person Babelfish    schedule 02.07.2015    source источник
comment
используйте dateformatter или вместо вызова dateFormComponents преобразуйте его в объект даты string.default, который по умолчанию будет содержать время в своем формате.   -  person johny kumar    schedule 02.07.2015
comment
Моя репутация слишком низкая, чтобы голосовать за ваш ответ, но я отметил его галочкой.   -  person Babelfish    schedule 02.07.2015


Ответы (1)


Движок — это то, как работает println(date). Он использовал метод description из NSDate, который возвращает данные со ссылкой на GMT (UTC). Таким образом, вы увидите разницу, основанную на смещении вашего часового пояса от GMT.

В выводе «2015-07-01 22:00:00 +0000» обратите внимание на окончание «+0000», которое является смещением часового пояса, и это GMT, а не ваш часовой пояс.

Результатом является использование средства форматирования даты и указание часового пояса, для часового пояса устройства вы можете использовать системный часовой пояс: [NSTimeZone systemTimeZone] или NSTimeZone.systemTimeZone() для Swift.

person zaph    schedule 02.07.2015
comment
Хорошо я понял. dateist правильный, но println(components) показывает результат с NSTimeZone.systemTimeZone() и println(date) использует GTM. Я попробовал NSDateFormatter() и получил правильную дату. Спасибо! - person Babelfish; 02.07.2015