Конвертировать DateTime из файла CSV в поле Java - PullRequest
2 голосов
/ 12 октября 2019

В моем csv-файле у меня есть столбец с такой датой:

my_col,...
2016-06-28 21:05:56 ADT
2016-06-28 22:05:56 ADT
2016-06-28 23:05:56 ADT

Мне нужно сопоставить этот CSV-файл с объектом Java.

Я пробовал несколько решений, например:

final String str = "2016-06-28 14:18:28 ADT";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "yyyy-MM-dd HH:mm:ss");
LocalDateTime ld2 = LocalDateTime.parse( str , f ) ;

Но у меня есть ошибка:

java.time.format.DateTimeParseException: текст '2016-06-28 14:18:28 ADT' не может быть проанализирован, неразобранный текстнаходится в индексе 19

Как преобразовать дату такого типа (2016-06-28 14:18:28 ADT) в поле Java?

И какой API показывает мне, как сопоставить файл CSV ссписок объектов Java?

1 Ответ

1 голос
/ 12 октября 2019

Для чтения CSV в Java вы можете использовать библиотеки, такие как, например, этот .

Что касается вопроса, в каком атрибуте / объекте анализируемая дата должна заканчиваться

", поэтому поле моего объекта java должно иметь тип: ZonedDateTime? "Нет, вы можете использовать строку, разделить ее на несколько целых чисел, использовать DateTime плюс строку для часового пояса ... как вам нравится.

Что касается вашего шаблона, посмотрите документация оракула по шаблонам datetimeformatter, вы можете использовать это:

DateTimeFormatter f = DateTimeFormatter.ofPattern( "yyyy-MM-dd HH:mm:ss z");
System.out.println(ZonedDateTime.parse("2016-06-28 14:18:28 ADT", f));
    says "2016-06-28T14:18:28-03:00[SystemV/AST4ADT]"

, где "SystemV / AST4ADT" с одной стороны отображается в респектабельных списках , но с другой стороны кажетсябыть устаревшим соглашением (от SystemV).

Теперь в комментариях было отмечено, что та же самая входная строка в других системах дает

2016-06-28T14:18:28-03:00[America/Halifax]

, и я думаю,, это можно проследить до настройки вашей локальной системы, точнее, настроек часового пояса jvm и часового пояса вашего компьютера (см. ниже).

Принимая во внимание дополнительную информацию из комментариев, становится ясно, что вы не можете реально восстановить «ADT» (буквально) из вашей входной строки, следуя по маршруту ZonedDateTime. Если вы хотите сохранить его, что-то вроде "2016-06-28 14:18:28 ADT".substring(21) может быть самой экономичной версией, какой бы ужасной она ни была. Я бы взял это.

Хотя есть альтернативы. Скорее всего, все ваши значения даты происходят из одного и того же часового пояса, и вам это не нужно. Если вы это сделаете, вы можете создать отображение между всеми возможными часовыми поясами , 425 на данный момент и их сокращениями (zonedDateTime.getZone () -> String).

Теперь это становится действительноэзотерически, кажется, что есть загадочный инструмент обновления часовых поясов от Oracle, который должен поддерживать часовые пояса JVM в актуальном состоянии и который берет свои значения из базы данных time ,текущая поддерживаемая версия: IANA База данных часовых поясов , при загрузке она содержит theory.html с разделом " Сокращения часовых поясов ", в котором говорится: "* Когда этот пакет установлен, он генерирует сокращения часового пояса, такие как 'EST', чтобы быть совместимым с человеческими традициями и POSIX". Затем я с радостью обнаружил, что в Linux есть команда zdump, которая отвечает на zdump Canada/Atlantic UTC с

Canada/Atlantic Sat Oct 12 03:39:19 2019 ADT

Вы можете извлечь весь список, я поместил команду и вывод в github gist . То, что вы не получите, это декодирование, например, "SystemV / AST4ADT". Кажется, что вся номенклатура SystemV устарела , поэтому мне интересно, как это появляется в ZonedDateTime. Где я в конце концов обнаружил, что это был файл "systemv" в базе данных ican , вы можете найти соответствующий контент ниже.

Есть также провайдер веб-услуг, где вы можете найти, надеюсь, полныйсписок часовых поясов плюс сокращения , и вы, вероятно, могли бы воспользоваться услугой, если вам нравятся подобные вещи. Однако не учитываются такие вещи, как «SystemV / AST4ADT».

Содержимое файла «systemv», вам необходимо сопоставить сокращения базы данных часовых поясов, используя смещения по Гринвичу (например, -4:00)

tzdb data for System V rules (this file is obsolete)
Zone    NAME        STDOFF  RULES/SAVE  FORMAT  [UNTIL]
Zone    SystemV/AST4ADT -4:00   SystemV     A%sT
Zone    SystemV/EST5EDT -5:00   SystemV     E%sT
Zone    SystemV/CST6CDT -6:00   SystemV     C%sT
Zone    SystemV/MST7MDT -7:00   SystemV     M%sT
Zone    SystemV/PST8PDT -8:00   SystemV     P%sT
Zone    SystemV/YST9YDT -9:00   SystemV     Y%sT
Zone    SystemV/AST4    -4:00   -       AST
Zone    SystemV/EST5    -5:00   -       EST
Zone    SystemV/CST6    -6:00   -       CST
Zone    SystemV/MST7    -7:00   -       MST
Zone    SystemV/PST8    -8:00   -       PST
Zone    SystemV/YST9    -9:00   -       YST
Zone    SystemV/HST10   -10:00  -       HST
...