我们在Windows Server 2003上安装了Coldfusion
未传递邮件的CFDirectory转储返回以下内容:
但问题在于迭代此查询,当我转储日期:
#dateFormat(mailStubs.DateLastModified,'dd-mmm-yyyy')#
这就是我得到的:
11-NOV-2026
11月11日 - 2027
11月11日 - 2028
11月11日 - 2029
11月11日 - 2029
11月11日 - 2029
11月11日1930年
11月11日1930年
11月11日1930年
11月11日1930年
11月11日1930年
11月11日1930年
11月11日1930年
11-NOV-1930
这样做:
datediff("n", mailStubs.DateLastModified, now())
now()即2011年11月30日,可以说2:00 PM给了我非常奇怪的结果
这只发生在Windows server 2003(我们的生产服务器)上,它在我的本地系统(XP)上运行良好
有什么想法吗?
答案 0 :(得分:4)
我知道这是一个非常老的线程,但是...... cfdirectory
返回本地化的日期字符串(不是日期对象)。所以你应该使用LS
(语言环境敏感)日期函数来解析它。原因是标准CF日期函数(DateFormat
,ParseDateTime
,...)始终使用美国日期约定。由于美国会议是第一个月,如果您传入“dd-mm-yyyyy”日期字符串,则会得到错误的结果。 (至少在某些时候。)
<cfscript>
setLocale("en_GB");
WriteOutput( dateFormat(lsParseDateTime("26/11/11 2:42 PM"), "dd-mmm-yyyy") );
</cfscript>
答案 1 :(得分:0)
看起来你的修改日期是以dateFormat()无法识别的格式出现的。
尝试使用java SimpleDateFormat转换为cf“{ts}”日期。 你创建一个SimpleDateFormat + ParsePosition,然后在你的循环中,调用sdf.parse()方法并用pp.setIndex(0)重置位置
如果您希望仅在Windows 2003服务器上运行此功能,请检查服务器范围server.os.version
<cfscript>
// init the class with a pattern that matches your wacky date string
// do this before you start looping
var sdf = createObject('java','java.text.SimpleDateFormat').init('dd/MM/yy HH:mm a');
// init a parse position, so the above class knows it's position during parsing
var pp = createObject('java','java.text.ParsePosition').init(0);
// run your loop
for ( var i = 1; i lte query.recordCount; i++ ) {
// convert the string date into a cf {ts} date.
cfdate = sdf.parse( query.myColumn[i], pp );
// reset the position for the next .parse() call
pp.setIndex(0);
// now you can use dateDiff() with your cfdate
// if the parse fails, cfdate will be undefined, so check with an isNull()
}
</cfscript>
简单演示它的工作原理:
<cfscript>
var dirty = [
'26/11/11 2:42 PM',
'27/11/11 10:53 PM',
'29/11/11 12:08 AM'
];
var sdf = createObject('java','java.text.SimpleDateFormat').init('dd/MM/yy HH:mm a');
var pp = createObject('java','java.text.ParsePosition').init(0);
var clean = [];
for ( var i = 1; i lte arrayLen( dirty ); i++ ) {
clean[i] = sdf.parse( dirty[i], pp );
pp.setIndex(0);
}
writeDump( var: dirty );
writeDump( var: clean );
</cfscript>
SimpleDateFormat是一个具体的类,用于以区域设置敏感的方式格式化和解析日期。它允许格式化(日期 - &gt;文本),解析(文本 - &gt;日期)和规范化。
http://docs.oracle.com/javase/1.4.2/docs/api/java/text/SimpleDateFormat.html
ParsePosition是Format及其子类用于在解析过程中跟踪当前位置的简单类。
http://docs.oracle.com/javase/1.4.2/docs/api/java/text/ParsePosition.html