Даты Excel сдвинулись на четыре года: системы дат

Если после переноса из Excel даты стали примерно на четыре года раньше или позже, проверьте систему дат исходной книги до массового исправления базы. Excel поддерживает системы 1900 и 1904. Одна календарная дата представлена в них разными серийными числами; разность составляет 1462 дня. Но этот признак ещё не доказывает, что именно он испортил весь импорт. В одном файле могут встречаться настоящие даты, строки и числа другого назначения.
Задача владельца CRM — сохранить исходник и получить проверяемое объяснение преобразования. Разработчик должен показать, какое значение прочитано, какая система применена и что записалось в целевое поле. Кнопка изменения формата ячейки не заменяет такую проверку. Если ошибка возникла при чтении числа без свойств книги, красивое отображение уже неверной даты только скроет причину.
Сравните одну известную дату в двух системах
Microsoft приводит пример 5 июля 2011 года: в системе 1900 ему соответствует число 40729, в системе 1904 — 39267. Разность чисел равна 1462, хотя календарная дата одна. Это подходящая контрольная пара для проверки импортера. Она не является записью клиента и не означает, что в вашем файле нужно искать именно такую дату.
Выберите также несколько собственных проверенных значений из обезличенной тестовой копии. Для каждого нужно знать не только ожидаемый день, но и источник этого ожидания. Если сравнивать две программы, обе из которых читают данные одной ошибочной библиотекой, совпадение ничего не докажет. Нужна независимая опора: исходная книга с установленной системой и заранее подтверждённая календарная запись.
| Что передано | Что известно об источнике | Ожидаемый разбор | Что нельзя делать автоматически |
|---|---|---|---|
| 40729 в поле даты XLSX | Книга использует систему 1900 | 5 июля 2011 года | Принять число за год или идентификатор |
| 39267 в поле даты XLSX | Книга использует систему 1904 | Та же календарная дата | Прочитать как число системы 1900 |
| Строка 2011-07-05 | Согласован текстовый формат даты | Разобрать год, месяц и день | Добавить 1462 как будто это серийное число |
| Число 39267 без описания поля | Тип и система не установлены | Сначала уточнить значение | Угадать дату по похожему диапазону |
| Пустая ячейка | Дата не передана | Сохранить отсутствие по правилам поля | Подменить нулём и исторической датой |
Свойство относится к книге, а не к внешнему виду столбца
В документации Open XML Microsoft описывает свойство Date1904, представляющее атрибут date1904. Для обработки XLSX важно учитывать метаданные книги вместе со значениями ячеек. Исполнитель должен проверить, как используемая библиотека предоставляет эти сведения: возвращает готовую дату или оставляет серийное число для самостоятельного преобразования.
Не просите оператора определять систему по тому, что файл когда-то создавали на Mac. История платформ объясняет происхождение двух вариантов, но не устанавливает настройки конкретной книги сегодня. Файл могли пересохранить, скопировать между книгами или получить из другого приложения. Предположение о компьютере автора слабее сведений самого источника и контрольной проверки его содержимого.
И не считайте формат отображения полноценным описанием типа. Ячейка может выглядеть как дата, а путь импорта — читать её исходное числовое значение. В другой колонке похожая запись может быть текстом. Уточнение этих различий полезнее глобальной замены всех значений на строки: такая замена тоже меняет договорённость об обмене и может затронуть формулы либо последующие расчёты.
Найдите границу, на которой изменился смысл
Составьте короткую цепочку из четырёх наблюдений: исходная ячейка, результат чтения файла, подготовленное значение поля и запись после сохранения. Зафиксируйте их для одной контрольной строки. Если после чтения уже получена правильная дата, а сдвиг появился позже, не нужно менять настройки чтения XLSX ради исправления следующего этапа.
Полезно записать также имя и версию обработчика, идентификатор задания импорта и выбранное правило поля. Это технические сведения, а не повод копировать всю клиентскую базу в переписку. Контрольные значения и обезличенные строки обычно позволяют воспроизвести преобразование без реальных анкет. Не отправляйте пароли, токены интеграций и полный архив документов вместе с примером ошибки.
Отдельно проверьте повторное открытие карточки. Значение на экране сразу после импорта иногда взято из промежуточного объекта, а не прочитано из базы. Закройте карточку, откройте её заново, затем сформируйте небольшую выгрузку. Если три представления расходятся, отметьте конкретный переход: чтение, сохранение или показ. Слово «дата» в названии поля не гарантирует одинакового поведения этих путей.

Не смешивайте систему Excel, часовой пояс и порядок цифр
Ошибка на один день после преобразования в UTC и расхождение на четыре года требуют разных проверок. В первом случае важен смысл календарной даты и момента времени. Во втором разумно проверить систему серийных чисел книги. Но размер видимого сдвига остаётся диагностическим признаком, а не разрешением изменить все записи одинаковой арифметикой.
Аналогично запись 05/07/2011 может быть неоднозначной для текстового разбора, если формат не согласован. Это другая проблема, чем чтение серийного числа с неверной начальной точкой. Для обмена нужны правила конкретного столбца: числовая дата XLSX, однозначная текстовая дата либо иной тип. Подробности устройства CSV разобраны в статье про кавычки и переносы при импорте.
Не определяйте тип по одному диапазону чисел. Похожее значение может оказаться кодом документа, длительностью, числом дней или техническим идентификатором. Даже если преобразование даёт правдоподобный календарь, это не подтверждает смысл исходного поля. Требование к импортеру должно опираться на согласованную схему данных, а при отсутствии схемы — показывать оператору понятный отказ или запрос уточнения.
Почему опасно прибавить 1462 ко всему столбцу
В одной пачке часть значений могла прийти из другой книги, часть — пройти автоматическое преобразование при копировании, часть — оказаться текстом. Универсальная поправка исправит одни строки и испортит другие. Перед изменением установите точный периметр: файл, задание, столбец, версии правил и список затронутых записей. Не заменяйте его догадкой «всё, что выглядит слишком старым».
Сохраните исходные значения и возможность сверить изменение. Для тестового исправления пригодится отдельный список: идентификатор записи, прежняя дата, предлагаемая дата, основание и результат проверки. Это предлагаемая организация работ, а не заявление о готовой функции любой CRM. Нельзя принимать операцию только по тому, что несколько новых дат стали визуально похожи на ожидаемые.
Если затронутое поле участвует в расписании, сроках задач или уведомлениях, проверьте связанные действия отдельно. Исправленная карточка не обязательно отменяет уже созданное задание и не подтверждает пересчёт отчёта. Владелец процесса должен определить, какие зависимые результаты нужно перепроверить. Не запускайте повторные рассылки либо изменение большого числа рабочих событий только ради проверки даты.
Проверьте повторный импорт и смешанный набор
После исправления обработчика загрузите учебный набор ещё раз в тестовую среду. Корректная дата не должна получать дополнительный сдвиг на каждом проходе. Затем измените в той же строке другое поле и повторите обновление: прежняя верная дата должна сохранить смысл. Такой сценарий обнаруживает преобразование, которое ошибочно применяется ко всей карточке при любом сохранении.
Добавьте в тест оба варианта книги, текстовую дату, пустую ячейку и число, не предназначенное для календаря. Для каждого заранее задайте ожидаемый результат или понятную причину отказа. Если система поддерживает только согласованный формат, честное сообщение об ограничении лучше молчаливого угадывания. Успешность импорта определяется содержимым записей, а не только зелёным уведомлением после выбора файла.
Проверьте и дальнейший экспорт: правильная дата в CRM не должна превратиться в неоднозначное число без описания при следующей передаче. Зафиксируйте, какой тип и формат получает следующая система. Приёмка закончена, когда контрольные значения сохраняют смысл на всех согласованных переходах, а оператор понимает, какие файлы допустимы и что делать с исключениями.
Что передать исполнителю для оценки доработки
Для оценки подготовьте минимальную обезличенную книгу, ожидаемые даты контрольных строк, описание целевого поля и наблюдение неправильного результата. Укажите, это новый импорт или обновление существующих карточек. Отдельно обозначьте необходимость анализа уже загруженных данных: исправление обработчика и восстановление истории являются разными работами с разными критериями приёмки.
В требования включите чтение системы книги, явное различение типов, журнал результата и тест повторного прохода. Согласуйте, как показывать оператору проблемные строки и можно ли продолжать обработку остальных. Такой состав позволяет оценивать конкретную доработку, не обещая универсальный импорт любых таблиц и автоматическое восстановление всех дат по одному характерному сдвигу.
Материалы для проверки
Если нужна реализация
Состав работ зависит от текущего проекта и подтверждённой причины. Можно обсудить диагностику или разработку подходящего решения.
Вопросы и ответы
Нужно прибавить 1462 дня ко всем неправильным датам?
Нет. Сначала подтвердите систему источника и затронутые строки. В одной пачке могут быть разные типы и уже преобразованные значения; массовая поправка способна испортить корректные данные.
Файл с Mac обязательно использует систему 1904?
Нет. Проверяйте настройку конкретной книги. История платформ не устанавливает систему файла, который могли изменить или пересохранить в другой программе.
Почему изменение формата ячейки не решает проблему?
Формат показа и преобразование исходного значения являются разными этапами. Если импортер уже прочитал число с неверной системой, нужно исправить соответствующий переход и проверить сохранённый результат.
Достаточно проверить правильную дату сразу после импорта?
Нет. Повторно откройте запись, обновите другое поле, выполните повторный импорт и небольшую выгрузку. Эти пути могут использовать другую обработку и снова менять значение.