首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自CFDirectory的DateTime未被ColdFusion正确解释

来自CFDirectory的DateTime未被ColdFusion正确解释
EN

Stack Overflow用户
提问于 2011-12-01 04:09:32
回答 2查看 770关注 0票数 3

我们在Windows Server 2003上安装了Coldfusion

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

但问题是在迭代此查询时,当我使用以下命令转储日期时:

代码语言:javascript
复制
#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

这样做:

代码语言:javascript
复制
datediff("n", mailStubs.DateLastModified, now())

现在()是2011年11月30日,假设下午2:00的结果非常奇怪

这只发生在Windows server 2003 (我们的生产服务器)上,它在我的本地系统(XP)上工作得很好

有什么想法吗?

EN

回答 2

Stack Overflow用户

发布于 2013-10-26 01:59:41

我知道这是一个非常老的线程,但是... cfdirectory返回一个本地化的日期字符串(而不是date对象)。因此,您应该使用LS (区域敏感)日期函数来解析它。原因是标准的CF日期函数(DateFormatParseDateTime,...) 总是使用美国的日期约定。由于美国的约定是月份优先,如果您传入"dd-mm-yyyyy“日期字符串,将会得到错误的结果。(至少在某些时候是这样。)

代码语言:javascript
复制
<cfscript>
   setLocale("en_GB");
   WriteOutput( dateFormat(lsParseDateTime("26/11/11 2:42 PM"), "dd-mmm-yyyy") );
</cfscript>
票数 4
EN

Stack Overflow用户

发布于 2011-12-16 00:06:25

看起来您修改过的日期是dateFormat()无法识别的格式。

尝试使用java SimpleDateFormat转换为cf "{ts}“日期。创建一个SimpleDateFormat + ParsePosition,然后在循环中调用sdf.parse()方法并使用pp.setIndex(0)重置位置。

如果希望只在windows2003server上运行,请检查服务器范围server.os.version

代码语言:javascript
复制
<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>

简单演示它的工作方式:

代码语言:javascript
复制
<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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8332292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档