将特定时区的时间转换为UTC (ColdFusion/Java)



我们需要获取一个datetime字符串(我们已经从用户表单输入接收并验证过),将其视为特定于America/New_York时区,并将其转换为UTC

我们目前正在运行ColdFusion 2018,它的原生日期时间功能有限。所以我想挖掘底层Java。大多数cf相关的解决方案都是pre-java.time,所以我根据其他Stack Overflow的答案尝试了自己的解决方案。希望有更多Java知识的人可以查看此解决方案。(这是在CF脚本,但它应该是相当自我记录。)这是正确的吗?是否有更好/更有效的解决方案?

var validatedDateTime = '2022-06-29T14:30:00';
LocalDateTime = createObject('java', 'java.time.LocalDateTime');
ZoneID = createObject('java', 'java.time.ZoneId');
ZoneOffset = createObject('java', 'java.time.ZoneOffset');
ldt = LocalDateTime.parse(validatedDateTime);
nyZone = ZoneID.of('America/New_York');
odt = ldt.atOffset(nyZone.getRules().getOffset(ldt));
utcDateTime = odt.withOffsetSameInstant(ZoneOffset.UTC).toLocalDateTime();```

br

你说:

这个问题更多的是关于获取日期时间字符串(例如:'2022-06-29T14:30:00'),添加America/New_York时区,并将其转换为UTC。

LocalDateTime
.parse( "2022-06-29T14:30:00" )      // “taking a datetime string (e.g. '2022-06-29T14:30:00')”
.atZone( 
ZoneId.of( "America/New_York" )  // “adding the America/New_York timezone to it”
)                                    // Returns a `ZonedDateTime` object. 
.toInstant()                         // “converting it to UTC”

查看此代码运行在Ideone.com。

2022 - 06 - 29 t18:30:00z

<标题>

详细信息您忘记提及数据库引擎和列的确切类型。所以我们不能给出一个完整的答案。我可以解决部分问题。

我们的目标是获取用户的日期&时间,把它像美国/New_York和将其转换为UTC。

DateTimeFormatter fDate = DateTimeFormatter. … ;  // Define a formatter to match the format used by your user. 
LocalDate ld = LocalDate.parse( inputDate , fDate ) ;

DateTimeParseException检测输入故障的Trap。

LocalTime执行类似操作。

DateTimeFormatter fTime = DateTimeFormatter. … ;  // Define a formatter to match the format used by your user. 
LocalTime lt = LocalDate.parse( inputTime , fTime ) ;

与时区组合以确定时刻。

ZoneId z = ZoneId.of( "America/New_York" ) ;
ZonedDateTime zdt =
ZonedDateTime.of( ld , lt , z ) ;

调整到UTC

Instant instant = zdt.toInstant() ;

所有这些已经在Stack Overflow上讨论过很多次了。

我是这样做的:

和你一样,我用UTC存储时间戳。然后我将它们以ISO-8601格式输出到DOM中,并包装在一个元素中,这样我就可以找到它们并在浏览器中使用任意数量的JavaScript库进行转换。我用sugar.js,我喜欢它。

这样做的好处是,因为时间戳是在浏览器中呈现的,它将使用在该计算机上设置的当前时间和时区。结果是时间戳将在本地呈现,无论他们在哪个时区。

例如,在ColdFusion中的服务器上,下面的代码将您的本地服务器时间转换为UTC。即使你的服务器是在UTC,我认为你应该这样做,只是为了始终确保。

utc = DateConvert(“Local2UTC”, now());

然后,在DOM中输出ISO格式的日期:

writeOutput('<span class="isodate">#DateFormat(utc, "YYYY-MM-DD")#T#TimeFormat(utc, "HH:mm:ss.l")#Z</span>');

浏览器将得到:

<span class="isodate">2022-06-29 15:00:00.000Z</span>

然后编写一些JavaScript代码来查找这些孤立元素并转换它们。在sugar.js中,它看起来像这样(我使用jquery只是为了让它更容易理解):

$('span.isodate').each(function(ix,elem) {
var iso = $(elem).text(),
d = Date.create(iso),
localDate = d.format('{Weekday}, {Month} {d}, {yyyy} at {h}:{mm} {tt} (' + d.relative() + ')');
$(elem).text(localDate);
});

当然你可以使用任何你想要的格式,或者任何你想要转换日期的Javascript库。Momentjs.com是另一个网站,但稍微复杂一点。Sugar.js轻量级且易于使用,并且有很好的日期支持。

上面的这些代码片段演示了拼图的各个部分,尚未经过测试。你可以让一切按照你想要的方式进行……例如,我有一个ColdFusion函数,它为给定的日期生成一个ISO-8601字符串。我还有一些javascript函数,可以很容易地找到这些元素并将其转换为本地时间。好运!

相关内容

  • 没有找到相关文章

最新更新