如何在Mirth中将本地日期转换为UTC?

时间:2018-06-12 15:58:16

标签: date utc date-conversion mirth mirth-connect

在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

我也尝试查找DateUtil的java文档并尝试了一些方法,但没有任何效果。

有人知道如何将日期字符串从本地时间转换为UTC吗?欢迎所有提示!

5 个答案:

答案 0 :(得分:2)

好吧,整整整整两天后,我终于找到了解决方案。最后,我不得不使用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));

无论如何,祝您美好的一天!

答案 1 :(得分:0)

在我的项目中,具有将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));
}

享受:)

答案 2 :(得分:0)

您应该使用Java8提供的最新类java.time

步骤如下:

第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));

答案 3 :(得分:0)

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 类。这个行业领先的框架取代了麻烦的旧日期时间类,例如DateCalendarSimpleDateFormat

DateTimeFormatter

解析您的输入字符串。定义要匹配的格式模式。

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

LocalDateTime

解析为LocalDateTime,因为您的输入缺少时区或UTC偏移量指示符。

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

缺少区域或偏移量意味着 not 并不代表时刻,是 not 在时间轴上的一点。相反,它代表了大约26-27小时(全球时区范围)内的潜在时刻。

OffsetDateTime

如果您确定该日期和时间旨在表示UTC时刻,请应用常数ZoneOffset.UTC以获得OffsetDateTime对象。

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

ZonedDateTime

您的问题含糊。听起来您可能知道为此输入指定的特定时区。如果是这样,请分配一个ZoneId以获得一个ZonedDateTime对象。

了解到距UTC的偏移量仅为小时,分钟和秒。仅此而已。相反,时区更多。时区是某地区人民过去,现在和将来对偏移量的更改的历史记录。

continent/region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用3-4个字母的缩写,例如ESTIST,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

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

Instant

调整回UTC的快速方法是提取Instant对象。 Instant始终是UTC。

Instant instan = zdt.toInstant() ;

ISO 8601

提示:只能使用标准的ISO 8601格式,而不是使用自定义格式来交换日期时间值作为文本。标准格式是实用的,易于通过机器解析,并且易于跨文化的人阅读。

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框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

目前位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

答案 4 :(得分:-2)

为此大声呼喊

//Contrived example of adding the default selection text
data.dashboardDefinitionList.splice(0, 0, { Id: 0, Name:"Select a Dashboard" });

<select id="dashboardSelectNew" v-model="formVariables.dashboardDefIndex" v-on:change="getDashboard">
       <option v-for="(dd, index) in dashboardDefinitionList"
       :value="dd.Id"
       :selected="formVariables.dashboardDefIndex == index">
          {{ dd.Name }}
        </option>
</select>

edit:有关.toISOString()select

的信息