我们在Windows Server 2003上安装了Coldfusion
在未送达的邮件上转储CFDirectory将返回以下内容:

但问题是在迭代此查询时,当我使用以下命令转储日期时:
#dateFormat(mailStubs.DateLastModified,'dd-mmm-yyyy')#这是我得到的:
11月11日-2026年
11月11日-2027年
11月11日-2028年
2029年11月11日
2029年11月11日
2029年11月11日
11-11-1930
11-11-1930
11-11-1930
11-11-1930
11-11-1930
11-11-1930
11-11-1930
11-11-1930
这样做:
datediff("n", mailStubs.DateLastModified, now())现在()是2011年11月30日,假设下午2:00的结果非常奇怪
这只发生在Windows server 2003 (我们的生产服务器)上,它在我的本地系统(XP)上工作得很好
有什么想法吗?
发布于 2013-10-26 01:59:41
我知道这是一个非常老的线程,但是... cfdirectory返回一个本地化的日期字符串(而不是date对象)。因此,您应该使用LS (区域敏感)日期函数来解析它。原因是标准的CF日期函数(DateFormat,ParseDateTime,...) 总是使用美国的日期约定。由于美国的约定是月份优先,如果您传入"dd-mm-yyyyy“日期字符串,将会得到错误的结果。(至少在某些时候是这样。)
<cfscript>
setLocale("en_GB");
WriteOutput( dateFormat(lsParseDateTime("26/11/11 2:42 PM"), "dd-mmm-yyyy") );
</cfscript>发布于 2011-12-16 00:06:25
看起来您修改过的日期是dateFormat()无法识别的格式。
尝试使用java SimpleDateFormat转换为cf "{ts}“日期。创建一个SimpleDateFormat + ParsePosition,然后在循环中调用sdf.parse()方法并使用pp.setIndex(0)重置位置。
如果希望只在windows2003server上运行,请检查服务器范围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是一个具体的类,用于以区域设置敏感的方式格式化和解析日期。它允许格式化(date -> text)、解析(text -> date)和规范化。
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
https://stackoverflow.com/questions/8332292
复制相似问题