ColdFusion无法正确解释CFDirectory的日期时间

时间:2011-11-30 20:09:32

标签: datetime coldfusion coldfusion-9

我们在Windows Server 2003上安装了Coldfusion

未传递邮件的CFDirectory转储返回以下内容:

enter image description here

但问题在于迭代此查询,当我转储日期:

#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)上运行良好

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

我知道这是一个非常老的线程,但是...... cfdirectory返回本地化的日期字符串(不是日期对象)。所以你应该使用LS(语言环境敏感)日期函数来解析它。原因是标准CF日期函数(DateFormatParseDateTime,...)始终使用美国日期约定。由于美国会议是第一个月,如果您传入“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