在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吗?欢迎所有提示!
答案 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)
DateUtil
。 (也许是Apache DateUtils库?)java.util.Date
。 用于解析缺少偏移量的字符串,然后为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.time 类。这个行业领先的框架取代了麻烦的旧日期时间类,例如Date
,Calendar
和SimpleDateFormat
。
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/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格式,而不是使用自定义格式来交换日期时间值作为文本。标准格式是实用的,易于通过机器解析,并且易于跨文化的人阅读。
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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和SimpleDateFormat
。
目前位于Joda-Time的maintenance 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中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如Interval
,YearWeek
,YearQuarter
和more。
答案 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
的信息