我们需要获取一个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函数,可以很容易地找到这些元素并将其转换为本地时间。好运!