我正在从数据库请求中获得一个java.sql.Timestamp。此值表示时间上的瞬间,因此时区与此无关(因此,java.sql.Timestamp没有时区,因为它代表全局瞬间)。我希望使用数据编织将其转换为ISO8601 DateTime字符串,但是数据编织将“添加”我的本地时区(+10:00)到值中。
见示例:
%dw 2.0
output application/json
import java!java::sql::Timestamp
---
{
epoch: 0 as DateTime,
epochFromDatabase: Timestamp::new(0) as DateTime
}如果结果/预览是:
{
"epoch": "1970-01-01T00:00:00Z",
"epochFromDatabase": "1970-01-01T10:00:00Z"
}您可以看到,尽管在UTC(Z)中,第二个值(epochFromDatabase)已经添加了+10小时。
这只能用数据编织来纠正吗?我知道我可以在java中纠正这一点,但我必须只使用数据编织/骡子特性。
---这不是一个java问题,例如:
Timestamp epochTimestamp = new Timestamp(0);
System.out.println(epochTimestamp.toString());
System.out.println(epochTimestamp.toInstant().toString());
System.out.println(epochTimestamp.getTime());写:
1970-01-01 10:00:00.0
1970-01-01T00:00:00Z
0因此,toString确实意味着一个本地时间(而不是在iso8601中),但是当转换为一个瞬间( toString默认为iso8601)时,这是正确的。
发布于 2020-05-18 14:09:39
DateTime总是有一个时区。您可以尝试一个没有LocalDateTime的:
epochFromDatabase: Timestamp::new(0) as LocalDateTime输出:
"epochFromDatabase": "1969-12-31T21:00:00"发布于 2020-05-23 22:10:30
我只是在这里添加我的想法,以便您可以作出您的解决办法,如上述评论;
-- DataWeave中日期时间的默认格式实际上是ISO8601。因此,我们不需要指定格式字符串,也不需要分别格式化两个成员。
我在这里什么也看不见。

如果您在日期中看到类似的不匹配,那么您可以尝试像下面这样定义TimeZone。
%dw 2.0
output application/json
var utc = "UTC" as TimeZone
fun getFormattedDateTimeZoneBased()=(now() >> utc) as String
---
{
myDate: getFormattedDateTimeZoneBased()
}https://stackoverflow.com/questions/61865619
复制相似问题