代码之家  ›  专栏  ›  技术社区  ›  kramer65

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

  •  4
  • kramer65  · 技术社区  · 7 年前

    在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

    我还尝试查找DaveTIL的Java文档,并尝试了一些方法,但没有效果。

    有人知道我如何将DateString从本地时间转换为UTC吗?欢迎所有小费!

    5 回复  |  直到 7 年前
        1
  •  2
  •   kramer65    6 年前

    好吧,我花了整整两天的时间才找到解决办法。最后,我不得不攻读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));
    

    不管怎样,祝大家有个美好的一天!

        2
  •  0
  •   Yogesh Rathi    6 年前

    在我的项目中有转换函数 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));
    }
    

    享受:

        3
  •  0
  •   Basil Bourque    6 年前

    DR

    • 不要使用 DateUtil 不管是什么。(也许是ApacheDateutils库?)
    • 不要使用可怕的旧日期时间类,如 java.util.Date .
    • 运用现代行业领先 Java.时间 类。

    用于分析缺少偏移量的字符串,然后为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.时间

    Java中的现代方法使用 Java.时间 类。这个行业领先的框架取代了诸如 Date , Calendar SimpleDateFormat .

    DateTimeFormatter

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

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

    LocalDateTime

    作为解析 本地日期时间 因为您的输入缺少时区指示器或与UTC的偏移量。

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

    缺少区域或偏移意味着这样做 代表片刻,是 时间线上的一个点。相反,这代表 潜在的 时间跨度约为26-27小时,分布在全球各个时区。

    OffsetDateTime

    如果您确定此日期和时间是用来表示UTC中的某个时刻,请应用常量 ZoneOffset.UTC 得到一个 偏移日期时间 对象。

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

    ZonedDateTime

    你的问题很含糊。听起来你可能知道这个输入的特定时区。如果是,则指定 ZoneId 得到一个 分区日期 对象。

    请理解,与UTC的偏移量仅为小时、分钟和秒数。没有更多,没有更少。相比之下,时区更重要。时区是过去、现在和将来对某一地区人民使用的偏移量的变化的历史。

    指定一个 proper time zone name 格式为 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的方法是提取 瞬间 对象。安 瞬间 总是在UTC中。

    Instant instan = zdt.toInstant() ;
    

    ISO 8601

    提示:不要使用自定义格式将日期时间值作为文本进行交换,而只使用标准格式 ISO 8601 格式。标准格式实用,易于机器解析,易于跨文化阅读。

    这个 Java.时间 类在解析/生成字符串时默认使用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.时间

    这个 java.time 框架是在Java 8和之后构建的。这些类取代了麻烦的旧类 legacy 日期时间类,如 java.util.Date , Calendar 和; SimpleDateFormat .

    这个 Joda-Time 项目,现在在 maintenance mode ,建议迁移到 java.time 类。

    要了解更多信息,请参阅 Oracle Tutorial . 和搜索堆栈溢出的许多例子和解释。规格是 JSR 310 .

    你可以交换 Java.时间 直接使用数据库的对象。使用A JDBC driver 符合 JDBC 4.2 或稍后。不需要弦,不需要 java.sql.* 类。

    在哪里获得java.time类?

    这个 ThreeTen-Extra project使用其他类扩展java.time。这个项目是将来可能添加java.time的一个试验场。你可以在这里找到一些有用的类,比如 Interval , YearWeek , YearQuarter more .

        4
  •  0
  •   NullPointer    6 年前

    你应该用最新的课程 java.time 由Java8提供。

    步骤如下:

    步骤1。 解析 String LocalDateTime

    第二步。 转换 本地日期时间 ZonedDateTime 然后我们可以在不同的 timezone .

    希望此帮助:

    在欢笑中,你可以这样写:

    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));
    
        5
  •  -2
  •   Boosh    7 年前

    喊一声

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

    编辑:有关.toisostring()的信息 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString