在Coldfusion中进行.NET时间字符串转换

4

我有一个来自.NET的六位时间字符串,我想将其转换为ColdFusion中的时间戳。正确的转换方式是什么?

string= 20190126195631
日期很简单:
thisDate = '#mid(string,5,2)#/#mid(string,7,2)#/#mid(string,1,4)#'
为了获取时间,我尝试过:
timestamp = timeFormat(parseDateTime(mid(string,9,6)),'HH:mm')

如何使用195631来显示时间戳?


许多人使用JAVA方法 formatter.parse() https://www.petefreitag.com/item/569.cfm - Bernhard Döbler
3
我编写了用户自定义函数(UDFs)来进行相互转换。使用DateUnhash将字符串转换为日期/时间值。 https://gist.github.com/JamoCA/8961085 - James Moberg
3个回答

4

time = '#mid(string,9,2)-8#

不要仅仅从小时数减去8,因为当UTC时间在午夜到上午7点之间时,会返回无效值如“-1 AM”或“-8 AM”。

此外,如果你要将该值转换为本地时间,请注意夏令时的变化。8小时的偏移量可能会根据年份和时区而变成7小时。不要使用硬编码的数字,可以使用DateConvert函数将UTC转换为本地时间,并使用ParseDateTime来进行格式转换,而不是使用多个字符串函数。

请记住,对于所有建议的方法,都存在优缺点和潜在的错误/陷阱,这取决于你使用的ColdFusion版本。因此,一定要测试各种日期值和时区。

ColdFusion 2016+语法(注意,使用“nn”表示分钟。可运行示例

str = "20190126175631";
utcDate = parseDateTime(str, "yyyyMMddHHnnss");
localDate = DateConvert("utc2Local", utcDate);

writeOutput("utcDate ="& utcDate &" localDate = "& localDate);

ColdFusion 10/11语法(注意,使用“mm”代表分钟。可运行示例

str = "20190126175631";
utcDate = parseDateTime(str, "yyyyMMddHHmmss");
localDate = DateConvert("utc2Local", utcDate);

writeOutput("utcDate ="& utcDate &" localDate = "& localDate);

1
是的,我在下午4点左右遇到了一个-8错误,因为0-8不是有效的时间。dateConvert是正确的解决方案。谢谢! - Stephen Sharpe
看起来弹出转换使用的是 mm 表示分钟,而不是 nn。消息:yyyyMMddHHnnss 不是有效的日期格式。yyyyMMddHHmmss https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html - Stephen Sharpe
更新并附上示例 @StephenSharpe - 是的,在CF2016+中,nn是有效的,而CF10/11使用mm(这就是我在提到注意事项和版本依赖时的意思)。你正在使用CF10/11吗?如果是的话,可能需要更新问题标签。我(错误地)假设你正在使用2016+版本。 - SOS
@CharlesRobertson - 更简单,但是...由于Adobe破坏了向后兼容性:-/...思考一下,字符串函数(或Java)在升级时更具解析能力。不过我会保留DateConvert用于转换为本地时间。 - SOS

2

谢谢!你的评论帮助我认识到时间简单地表示为:HHMMSS 19 = 下午7点,56分钟和31秒。

让我感到困惑的是GMT(对我来说是-8小时)的变化。 所以答案是:

最初的回答:

time = '#mid(string,9,2)-8#:#mid(string,11,2)#'

1
以上代码在某些情况下会失败。请参见更多细节 - SOS
编辑 - 错误的链接。应该是 https://dev59.com/QbHma4cB1Zd3GeqPK2e5#54384804 - SOS

2
我可能有点疯了,但是看起来这个字符串可以这样拆分: "最初的回答"
2019-01-26 19:56:31

因此,使用Coldfusion:


<cfset datetimestring = "20190126195631">

<cfset year = Mid(datetimestring,1,4)>
<cfset month = Val(Mid(datetimestring,5,2))>
<cfset day = Val(Mid(datetimestring,7,2))>
<cfset hour = Val(Mid(datetimestring,9,2))>
<cfset minute = Val(Mid(datetimestring,11,2))>
<cfset second = Val(Mid(datetimestring,13,2))>


<cfset dateTime = CreateDateTime(year,month,day,hour,minute,second)>

<cfset dateTimeOffset = DateAdd("h", -8, dateTime)>

<cfoutput>
#dateTimeOffset#
</cfoutput>
"最初的回答" 可能只是一个纪元时间戳,但它看起来像是一个 '日期时间' 格式吗?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,