Datetime ColdFusion未正确解释来自CFDirectory的日期时间

Datetime ColdFusion未正确解释来自CFDirectory的日期时间,datetime,coldfusion,coldfusion-9,Datetime,Coldfusion,Coldfusion 9,我们在Windows Server 2003上安装了Coldfusion 未送达邮件上的CFDirectory转储将返回以下内容: 但问题是在迭代此查询时,我将日期转储为: #dateFormat(mailStubs.DateLastModified,'dd-mmm-yyyy')# 这就是我得到的: 2026年11月11日 2027年11月11日 2028年11月11日 2029年11月11日 2029年11月11日 2029年11月11日 1930年11月11日 1930年11月11日 1

我们在Windows Server 2003上安装了Coldfusion

未送达邮件上的CFDirectory转储将返回以下内容:

但问题是在迭代此查询时,我将日期转储为:

#dateFormat(mailStubs.DateLastModified,'dd-mmm-yyyy')#
这就是我得到的:

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月11日
1930年11月11日

这样做:

datediff("n", mailStubs.DateLastModified, now())
现在()2011年11月30日下午2:00会给我带来非常奇怪的结果

这只发生在Windows server 2003(我们的生产服务器)上,在我的本地系统(XP)上运行良好


有什么想法吗?

看起来你修改的日期是以dateFormat()无法识别的格式出现的

尝试使用java SimpleDataFormat转换为cf{ts}日期。 创建SimpleDataFormat+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>

//使用与古怪的日期字符串匹配的模式初始化该类
//在开始循环之前执行此操作
var sdf=createObject('java','java.text.simpleDataFormat').init('dd/MM/yy HH:MM a');
//初始化一个解析位置,以便上面的类在解析过程中知道它的位置
var pp=createObject('java','java.text.ParsePosition').init(0);
//运行你的循环
对于(var i=1;i lte query.recordCount;i++){
//将字符串日期转换为cf{ts}日期。
cfdate=sdf.parse(query.myColumn[i],pp);
//重置下一个.parse()调用的位置
pp.setIndex(0);
//现在,您可以将dateDiff()与cfdate一起使用
//如果解析失败,cfdate将未定义,因此请使用isNull()检查
}
it工作的简单演示:

<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>

变量脏=[
“2011年11月26日下午2:42”,
“2011年11月27日晚上10:53”,
'2011年11月29日12:08上午'
];
var sdf=createObject('java','java.text.simpleDataFormat').init('dd/MM/yy HH:MM a');
var pp=createObject('java','java.text.ParsePosition').init(0);
var clean=[];
对于(var i=1;i lte arrayLen(脏);i++){
clean[i]=sdf.parse(dirty[i],pp);
pp.setIndex(0);
}
writeDump(变量:脏);
writeDump(var:clean);
SimpleDataFormat是一个具体的类,用于以区域设置敏感的方式格式化和解析日期。它允许格式化(日期->文本)、解析(文本->日期)和规范化

ParsePosition是Format及其子类使用的一个简单类,用于在解析期间跟踪当前位置


我知道这是一条非常古老的线索,但是
cfdirectory
返回本地化的日期字符串(不是日期对象)。因此,您应该使用
LS
(区分区域设置)日期函数来解析它。原因是标准CF日期函数(
DateFormat
ParseDateTime
,…)始终使用美国日期约定。由于美国惯例是月初,如果传入“dd-mm-yyyy”日期字符串,则会得到错误的结果。(至少在某些时候。)


setLocale(“en_GB”);
写输出(日期格式(lsParseDateTime(“26/11/11 2:42 PM”),“dd-mmm-yyyy”);
<cfscript>
   setLocale("en_GB");
   WriteOutput( dateFormat(lsParseDateTime("26/11/11 2:42 PM"), "dd-mmm-yyyy") );
</cfscript>