2014-08-28 8 views
3

Я только что узнал о функции ColdFusion CreateDate. Но, когда я использую CreateDate, вывод значения отличается. Я имею в виду, что он меняется каждый день и каждый день.ColdFusion createdate()

<cfoutput> 
<cfset txtBirthDate='07-10-1983'> 
<cfset valueOf_txtBirthDate = dateFormat(CreateDate(Year(txtBirthDate),Month(txtBirthDate),Day(txtBirthDate)),'YYYY-MMM-DD')> 

#txtBirthDate#<br/><br/> 
#valueOf_txtBirthDate#<br/> 
</cfoutput> 

Значение txtBirthDate является 07-10-1983, но значение valueOf_txtBirthDate, что CreateDate создал это 1983 года июль-10. Почему это июль? Предполагается, что он будет октябрь: 07 (дата), 10 (месяц), 1983 год (год).

Есть что-то неправильно в формате?

ответ

1

Поскольку по умолчанию ваша дата составляет формат mm/dd/yyyy. Таким образом,

<cfset txtBirthDate='07-10-1983'> 

будет считаться 10 июля 1983 г. CF. Следовательно, outout ...

+1

Более конкретно, строка дата будет * интерпретированы/разобран * на «Английский (США) конвенций локали», что означает месяц первый т.е. ' мм/дд/yyyy'. – Leigh

7

Вы используете createDate() очень запутанным способом. txtBirthDate не является датой, поэтому вы не должны использовать его в качестве входных данных для таких функций даты, как year(), month() и т. Д. Ввод должен быть уже быть объектом даты к моменту использования функции даты.

Предположим, вы начинаете со строки 07-10-1983, где формат mm-dd-yyyy.

txtBirthDate ='07-10-1983'; // dd-mm-yyyy 

// extract the specific date parts from the string 
yyyy = listLast(txtBirthDate, "-"); 
mm = listGetAt(txtBirthDate, 2, "-"); 
dd = listFirst(txtBirthDate, "-"); 

// create a date object out of those components 
birthDate = createDate(yyyy, mm, dd); 

// output the date object in human readable format 
writeOutput(dateFormat(birthDate, "YYYY-MM-DD")); 

(очевидно, что в реальном коде вы бы не иметь те комментарии, которые служат лишь констатировать очевидное!)

только когда-либо использовать dateFormat() в последний момент, как вы выводите его. Для других операций с датами используйте объект фактической даты: birthDate.

+0

На самом деле ColdFusion обрабатывает строку '07-10-1983' как дату, так как она находится в допустимом формате для дат. Попробуйте запустить этот код, чтобы проверить: 'writeDump (isDate ('07 -10-1983 '));' Проблема в том, что ColdFusion интерпретирует дату неправильно, предполагая, что первая часть - это месяц, когда на самом деле это дата. Следовательно, ОП указывает, что месяц и дата неверны. Ваше решение все еще работает, но вам нужно поменять логику для разбора месяца и даты, иначе он все равно получит ту же дату, с которой он должен был начать. –

+0

Хорошее место. Не заметил, что он работал в dd-mm-yyyy. Просто предположил, что он работал в сумасшедшем формате ваших парней. Я скорректировал свой код соответственно.CF возьмет любую старую строку и попытается преобразовать ее в [все], чтобы она соответствовала заданной функции. Но я подозреваю, что если вы посмотрите под капот, если вы дадите функции даты строке, сначала попытайтесь сделать это, указав дату, и используйте дату для аргумента; вместо фактического принятия строки, где она ожидает дату. Но, да, строка, отформатированная как 'mm-dd-yyyy', будет красиво отбрасываться на дату. –

+1

@ScottStroz это чертовски раздражает, кстати, '' isDate() 'возвращает' Yes' (sic) для строки. Он должен возвращать 'Нет'. Если функция была 'canBeConvertedToDate()', то 'Yes' может быть допустимым ответом, когда она передается строка (очевидно, применительно к действительному форматированию). Тем не менее: это было так, как в CFML в течение длительного времени: -/ –

0

Вы можете использовать функцию Java для ее выполнения. Вот как это работает:

<cfset txtBirthDate='07-10-1983' /> 
<cfset formatter = createObject("java","java.text.SimpleDateFormat") /> 
<cfset formatter.init("dd-MM-yyyy") /> 
<cfset birthDate= formatter.parse(txtBirthDate) /> 
0

похоже, следует сделать трюк:

<cfset txtBirthDate = '10-7-1983'> 
#DateFormat(txtBirthDate, "MMM, D, YYYY")# 

уведомление я обращенную позицию месяца и дня в CFSET, чтобы сделать его выйти прямо.

+0

С уважением, это не очень хороший подход. Причина, по которой строка была интерпретирована как 10 июля, заключается в том, что стандартные функции даты CF * всегда * интерпретируют строки в соответствии с соглашениями США, то есть месяцем раньше. Изменение числа месяца и дня, чтобы избежать использования функции, как было разработано, в лучшем случае является хрупким. Если вы работаете с строками «dd-mm-yyyy», правильным подходом является использование функций даты с учетом языка (Locale sensitive) с соответствующим языком. – Leigh

0

вы можете сделать что-то простое, как что:

txtBirthDate = '07-10-1983'; //dd-mm-yyyy 
arrayDate = listToArray(txtBirthDate, '-'); 
date_birthDate = createDate(arrayDate[3], arrayDate[2], arrayDate[1]); 

writeOutput(lsDateFormat(date_birthDate, 'yyyy-mm-dd'); 
0
<cfscript> 
    txtBirthDate=CreateODBCDate("1983-10-07"); 
    txtBirthDate=LSDateFormat(txtBirthDate, "dd/mm/yyyy"); 
</cfscript> 

<cfoutput> 
    #txtBirthDate# 
</cfoutput> 
Смежные вопросы