Как преобразовать локальную дату в UTC в Мирте? - PullRequest
0 голосов
/ 12 июня 2018

В Mirth я получаю локальную строку даты и времени (201801011000), которую мне нужно конвертировать в UTC.Вскоре я обнаружил, что использование классического JS new Date() не работает хорошо.

Это, например:

var d = new Date("2018-01-01 10:00");
logger.info(d.toString());

дает мне Invalid Date.

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

var d = DateUtil.getDate("yyyyMMddHHmm", "201801011000");

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

Я пытался получить методы, которые можно использовать с Object.getOwnPropertyNames(d), но это даетмне помогло TypeError: Expected argument of type object, but instead had type object

Я также пытался найти документы Java для DateUtil и попробовал некоторые методы из этого, но ничего не помогло.

Кто-нибудь знает, как я могу преобразовать строку даты из местного временив UTC?Все советы приветствуются!

Ответы [ 5 ]

0 голосов
/ 23 июля 2018

tl; dr

  • Не используйте DateUtil, что бы это ни было.(Возможно, библиотека Apache DateUtils?)
  • Не используйте ужасные старые классы даты и времени, такие как java.util.Date.
  • Используйте современные ведущие в отрасли java.time классы.

Код для разбора строки, в которой отсутствует смещение, затем назначение нулевого смещения для самого UTC,

LocalDateTime                // Represents a date and a time-of-day but without any concept of time zone or offset-from-UTC. NOT a moment, NOT a point on the timeline.
.parse( 
    "201801011000" ,
     DateTimeFormatter.ofPattern( "uuuuMMddHHmm" )
)  
.atOffset( ZoneOffset.UTC )  // Assign an offset-from-UTC. Do this only if you are CERTAIN this offset was originally intended for this input but was unfortunately omitted from the text. Returns an `OffsetDateTime`.
.toInstant()                 // Extract an `Instant` from the `OffsetDateTime`. Basically the same thing. But `Instant` is always in UTC by definition, so this type is more appropriate if your intention is to work only in UTC. On the other hand, `Instant` is a basic class, and `OffsetDateTime` is more flexible such as various formatting patterns when generating `String` object to represent its value.

Использование java.time

Современный подход в Java использует классы java.time .Эта ведущая в отрасли инфраструктура вытеснила ужасно хлопотные старые классы даты и времени, такие как Date, Calendar и SimpleDateFormat.

DateTimeFormatter

Анализ вашей входной строки.Определите шаблон форматирования для соответствия.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuuMMddHHmm" ) ;
String input = "201801011000" ;

LocalDateTime

Выполните синтаксический анализ как LocalDateTime, поскольку в вашем входе отсутствует индикатор часового пояса или смещения от UTC.

LocalDateTime ldt = LocalDateTime.parse( input , f ) ;

Отсутствие зоны или смещения означает, что не представляет момент, не - точка на временной шкале.Вместо этого он представляет потенциальных моментов в диапазоне около 26-27 часов, диапазоне часовых поясов по всему земному шару.

OffsetDateTime

Если вы знаете, дляЧтобы убедиться, что эта дата и время дня должны были представлять момент в UTC, примените константу ZoneOffset.UTC, чтобы получить объект OffsetDateTime.

OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC ) ;

ZonedDateTime

Ваш вопрос расплывчат.Похоже, вы знаете конкретный часовой пояс, предназначенный для этого ввода.Если это так, присвойте ZoneId, чтобы получить ZonedDateTime объект.

Поймите, что смещение от UTC - это всего лишь количество часов, минут и секунд.Ни больше ни меньше.В отличие от часового пояса гораздо больше.Часовой пояс - это история прошлых, настоящих и будущих изменений в смещении, используемом людьми определенного региона.

Укажите правильное имя часового пояса в формате continent/region, например America/Montreal, Africa/Casablanca или Pacific/Auckland.Никогда не используйте 3-4-буквенное сокращение, например EST или IST, поскольку они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = ldt.atZone( z ) ;

Instant

Быстрый способ вернуться обратно в UTC - извлечь объект Instant.Instant всегда в UTC.

Instant instan = zdt.toInstant() ;

ISO 8601

Совет: Вместо использования пользовательского формата для обмена значениями даты и времени в виде текста используйте только стандартный ISO8601 форматы.Стандартные форматы практичны, их легко разбирать на машине, их легко читать людям разных культур.

Классы java.time используют форматы ISO 8601 по умолчанию при разборе / генерации строк.Метод ZonedDateTime::toString разумно расширяет стандарт, добавляя имя зоны в квадратных скобках.

Instant instant = Instant.parse( "2018-07-23T16:18:54Z" ) ;  // `Z` on the end means UTC, pronounced “Zulu”. 
String output = instant.toString() ;  // 2018-07-23T16:18:54Z

И всегда включайте смещение и часовой пояс в вашей строке.Опускать смещение / зону на мгновение - все равно что опускать валюту для цены: все, что у вас осталось, - это неоднозначное число, ничего не стоящее.На самом деле, хуже, чем ничего, поскольку это может вызвать все виды путаницы и ошибок.


О java.time

Java.time framework встроен в Java 8 и новее.Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar и & SimpleDateFormat.

Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .

Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .

Вы можете обмениваться java.time объектами напрямую с вашей базой данных.Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии.Нет необходимости в строках, нет необходимости в java.sql.* классах.

Где получить классы java.time?

  • Java SE 8 , Java SE 9 , Java SE 10 и позже
    • Встроенный.
    • Часть стандартного Java API с встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функций java.time перенесена на Java 6 & 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии комплектов Android для реализации классов java.time .
    • Для более ранних версий Android (<26): <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP проект адаптируется ThreeTen-Backport (упомянуто выше).См. Как использовать ThreeTenABP… .

ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти несколько полезных классов, таких как Interval, YearWeek, YearQuarter и more .

0 голосов
/ 23 июля 2018

Вы должны использовать последние классы java.time, предоставленные с Java8.

Шаги следующие:

Шаг-1. АнализString в LocalDateTime

Шаг-2. Преобразование LocalDateTime в ZonedDateTime, и затем мы можем конвертировать между различными timezone.

Надеюсь, эта помощь:

В Mirth вы можете написать как:

String str = "201207011000"; 
var date_in_utc =java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")
                .format(java.time.ZonedDateTime.of(java.time.LocalDateTime
                .parse(str,java.time.format.DateTimeFormatter
                .ofPattern("yyyyMMddHHmm")),java.time.ZoneId.of("CET"))
                .withZoneSameInstant(java.time.ZoneOffset.UTC));

Полный фрагмент:

ZoneId cet = ZoneId.of("CET");
String str = "201207011000";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmm");
LocalDateTime localtDateAndTime = LocalDateTime.parse(str, formatter);
ZonedDateTime dateAndTimeInCET = ZonedDateTime.of(localtDateAndTime, cet );
System.out.println("Current date and time in a CET timezone : " + dateAndTimeInCET);
ZonedDateTime utcDate = dateAndTimeInCET.withZoneSameInstant(ZoneOffset.UTC);
System.out.println("Current date and time in UTC : " + utcDate);
System.out.println("Current date and time in UTC : " + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm").format(utcDate));
0 голосов
/ 17 июля 2018

Хорошо, после двух с лишним дней я наконец нашел решение.В конце концов мне пришлось подключиться к Java, но, поскольку я не мог импортировать какие-либо Java-зависимости, мне пришлось использовать их прямой путь к классу (например: java.text.SimpleDateFormat).

В конце концов это то, что сработало для меня:

var datestr = "201207011000".slice(0, 12);  // This is just a datetime string to test with

var formatter_hl7 = new java.text.SimpleDateFormat("yyyyMMddHHmm");
formatter_hl7.setTimeZone(java.util.TimeZone.getTimeZone("CET"));
var formatter_utc = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm");
formatter_utc.setTimeZone(java.util.TimeZone.getTimeZone("UTC"));

var date_in_utc = formatter_utc.format(formatter_hl7.parse(date_str));

Несмотря ни на что, я желаю всем вам прекрасного дня!

0 голосов
/ 19 июля 2018

В моем проекте есть функция для конвертирования datestring местного времени в UTC,

function getDateInUTC(dateString) {
    return new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm").setTimeZone(java.util.TimeZone.getTimeZone("UTC")).format(new java.text.SimpleDateFormat("yyyyMMddHHmm").setTimeZone(java.util.TimeZone.getTimeZone("CET")).parse(dateString));
}

Наслаждайтесь:)

0 голосов
/ 11 июля 2018

Дайте этому крик

var d = DateUtil.getDate("yyyyMMddHHmm", "201801011000");
var utcD = new Date(d).toISOString();

edit: Информация о .toISOString () https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString

...