DateTime из CFDirectory неправильно интерпретируется ColdFusion - PullRequest
3 голосов
/ 01 декабря 2011

У нас установлен Coldfusion на Windows Server 2003

Дамп CFDirectory на недоставленную почту возвращает следующее:

enter image description here

Но проблема заключается в повторении этого запроса, когда я сбрасываю дату с:

#dateFormat(mailStubs.DateLastModified,'dd-mmm-yyyy')#

Вот что я получаю:

11 ноября 2026 г.
11 ноября 2027 г.
11 ноября 2028 г.
11 ноября 2029 г.
11 ноября 2029 г.
11 ноября 2029 г.
11 ноября 1930 г.
11 ноября 1930 г.
11 ноября 1930 г.
11 ноября 1930 г.
11 ноября 1930 г.
11 ноября 1930 г.
11 ноября 1930 г.
11 ноября 1930 г.

Таким образом:

datediff("n", mailStubs.DateLastModified, now())

now () 30 ноября 2011 года, скажем, 2:00 PM дает мне очень странные результаты

Это происходит только на Windows Server 2003 (наш производственный сервер), он отлично работал в моей локальной системе (XP)

Есть идеи?

Ответы [ 2 ]

4 голосов
/ 25 октября 2013

Я знаю, что это действительно старый поток, но ... 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>
0 голосов
/ 15 декабря 2011

Похоже, что ваши измененные даты выходят в формате, который 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 - это конкретный класс для форматирования и анализа дат с учетом языка. Он позволяет форматировать (дата -> текст), анализировать (текст -> дата) и нормализовать.

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

...