我正在尝试将两个日期字符串解析为日期对象。该代码适用于一个字符串,但会为另一个字符串抛出“无效的日期时间”错误。唯一的区别是它在开始时有一个“星期六”!请告诉我为什么会这样,以及如何解决它!
<cfset datetimetest1 = "23 Nov 2013 00:53:12 +0000">
<!--- ^ This throws an error (when you try to pass it). Error says 'invalid date time' --->
<cfset datetimetest2 = "Sat, 23 Nov 2013 00:53:12 +0000">
<!--- ^ This works when it is parsed --->
<cfoutput>
#parsedatetime(datetimetest1)# #parsedatetime(datetimetest2)#
</cfoutput>
答案 0 :(得分:0)
<强>更新强>
从CF10 +开始,您可以使用自定义格式字符串来指示函数如何解析输入并将其转换为日期时间对象:
// Custom format string
dateObject = parseDateTime("23 Nov 2013 00:53:12 +0000"
, "dd MMM yyyy HH:mm:ss zzz");
这是CF的灵活性和易用性可能是IMO的一个缺点。遗憾的是parseDateTime
不允许您指定输入字符串的格式,因此CF必须进行大量猜测以“自动”将字符串转换为日期对象。
CF使用的工具之一是java的SimpleDateFormat类,它利用模式将字符串解析或转换为Dates。我的理解是CF维护标准日期/时间模式的列表(根据美国日期惯例)。您的第一个字符串不得与任何这些模式匹配。因此错误。
如果您的日期字符串始终是UTC,您只需使用列表函数省略时区偏移量即+ 0000,然后像往常一样解析字符串:
<cfscript>
origString = "23 Nov 2013 00:53:12 +0000";
dateString = listFirst(origString, "+");
WriteDump(parseDateTime(dateString));
</cfscript>
或者你可以使用SimpleDateFormat和适当的模式dd MMM yyyy HH:mm:ss Z
进行DIY(参见Date and Time Patterns)。请注意,返回的日期是当地时间,因此如果您想要UTC时间,可能需要使用DateConvert:
// get formatter based on default locale
formatter = createObject("java", "java.text.SimpleDateFormat").init();
// set up pattern for input date string
formatter.applyPattern("dd MMM yyyy HH:mm:ss Z");
// parse it into a date object
dateObject = formatter.parse("23 Nov 2013 00:53:12 +0000");
// display result in local and UTC time
WriteDump("local="& dateObject);
WriteDump("utc="& DateConvert("local2UTC", dateObject));
答案 1 :(得分:0)
我确定了以下来源使用的RSS日期,并针对isDate()
,DateFormat()
和LSDateFormat()
对其进行了测试。 ColdFusion 10,286680只能解析65%的日期(58个中的38个)。
http://rssdateformats.tumblr.com/
https://github.com/mjibson/goread/blob/0387db10bd9fd9ccd90d557fa30b6e494efa577a/goapp/utils.go#L129
这是我写的测试脚本:
https://gist.github.com/JamoCA/7617349
我一直在寻找一个Java日期解析器库,最近发现了Natty和StringToTime,但还没有使用过。 (两种资源都不提供可下载的JAR文件。):