Arhn - архитектура программирования

Сравнение дат или часовой пояс не установлены должным образом

Я пытаюсь сделать простое сравнение дат с целью перехода к другому индексу массива в зависимости от дня.

Хотя это намного эффективнее, чем код, который я использовал, следующее (Невозможно проанализировать дату) не сохраняет смещение часового пояса:

let noaaDate = "2014-08-22T15:00:00-04:00"
let format="yyyy-MM-dd'T'HH:mm:ssZ"

var dateFmt = NSDateFormatter()
dateFmt.dateFormat = format
let newreadableDate = dateFmt.dateFromString(noaaDate)
println(newreadableDate)

Выход:

Optional(2014-08-22 19:00:00 +0000)

Когда я добавляю следующее:

dateFmt.timeZone = NSTimeZone.localTimeZone()  // I've even tried defaultTimeZone

выход тот же. Где это, кажется, становится проблемой позже, когда я делаю следующее:

// FYI:  parseNOAADateTime is that code above        
var earliestTimeNS = parseNOAADateTime(earliestTime!) 
let calendar = NSCalendar.currentCalendar()
let components = calendar.components(.CalendarUnitDay, fromDate: earliestTimeNS)
let dayZero = components.day

// stuff, like starting a loop
let tempDateTimeString = "2014-08-31T01:00:00-04:00"
let thisDateTime = parseNOAADateTime(tempDateTimeString!)
let tempDateTimeComponents = calendar.components(.CalendarUnitDay, fromDate: thisDateTime)
let forecastIndex = tempDateTimeComponents.day - dayZero

Теперь прогнозный индекс ДОЛЖЕН быть равен 6, потому что tempDateTimeComponents.day ДОЛЖЕН быть равен 31. Однако они равны 5 и 30 соответственно, что означает, что данные за четыре часа заканчиваются данными за предыдущий день.

Где я ошибаюсь?

Спасибо


  • NSDate не имеет часового пояса, он всегда хранится в секундах с начала эпохи. NSDateFormatter имеет понятие часовых поясов, но когда он создает NSDate, это всегда UTC/GMT. 25.08.2014
  • NSCalendar также имеет свойство часового пояса, которое преобразует время UTC в заданный часовой пояс перед возвратом компонентов. Если вы хотите использовать часовой пояс из строки даты, вам придется проанализировать его самостоятельно. 25.08.2014
  • Есть идеи, почему тогда дневной компонент даты на единицу меньше, чем должен быть в течение первых четырех часов (как в примере выше)? Когда я извлекаю компонент дня из этой второй даты и времени, он должен быть 31, но я получаю 30. 25.08.2014
  • Потому что дата и время во втором примере — 21:00 30 августа по UTC. Средство форматирования даты считывает часовой пояс (-400) и применяет его ко времени 01:00 31 августа — 4:00 равно 21:00 30 августа. Средство форматирования даты понимает часовые пояса. Дата ВСЕГДА UTC. Когда средство форматирования даты используется для преобразования между NSDate и NSString, оно соответствующим образом применяет часовой пояс. 25.08.2014
  • Затем это возвращается к моей первоначальной проблеме: при преобразовании этого текста даты и времени в NSDate дата и время остаются прежними, а -04:00 заменяется на +0000. Это происходит, даже когда я пытаюсь установить часовой пояс (как указано выше). Если, как вы предполагаете, значение, которое я получаю из calendar.components.day, правильное, то при создании NSDate произошел сбой. Могу ли я что-то сделать, чтобы исправить это? 25.08.2014
  • В этом нет ничего неправильного, это неправильное представление о том, как все работает. При преобразовании строкового времени с компонентом часового пояса применяется смещение часового пояса для преобразования времени, возвращаемого в формат UTC. Вы можете выкопать часовой пояс из строки и применить его к календарю самостоятельно, или, если все, что вас интересует, это дата (что, кажется, имеет место), просто обрезать строку в «T» и преобразовать ее, которая даст вам NSDate с правильной датой и временем полуночи. 26.08.2014

Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..