Каков наиболее эффективный способ преобразования восьмизначного числа в дату? - PullRequest
3 голосов
/ 16 ноября 2011

Я использую ColdFusion 9.0.1 и некоторую базу данных, которую я не могу изменить.

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

YYYYMMDD

Мне нужно иметь возможность читать дату, добавлять и вычитать дни из даты и создавать новые даты. Я ищу решение ColdFusion для эффективного (не много кода) для преобразования даты в наш стандартный формат, который является

MM/DD/YYYY

А затем преобразовать его обратно в формат базы данных для сохранения.

Мне нужно закодировать это таким образом, чтобы программисты, не относящиеся к ColdFusion, могли легко прочитать это и использовать его, копировать и модифицировать его для других функций (таких как добавление дня к дате). Итак, я не ищу наименьшее количество кода, но эффективный и читаемый код.

Можете ли вы предложить что-нибудь, что сделало бы этот блок кода более гибким, читаемым или более эффективным (меньше кода)?

<cfscript>

// FORMAT DB DATE FOR BROWSER
DateFromDB = "20111116";
DatedToBrowser = createBrowserDate(DateFromDB);
writeOutput(DatedToBrowser);

function createBrowserDate(ThisDate) {
    ThisYear = left(ThisDate, 4); 
    ThisMonth = mid(ThisDate, 4, 2);
    ThisDay = right(ThisDate, 2);
    NewDate = createDate(ThisYear, ThisMonth, ThisDay);
    NewDate = dateFormat(NewDate, "MM/DD/YYYY");
    return NewDate;
}

// FORMAT BROWSER DATE FOR DB
DateFromBrowser = "11/16/2011";
DateToDB = createDBDate(DateFromBrowser);
writeDump(DateToDB);

function createDBDate(ThisDate) {
    ThisYear = year(ThisDate); 
    ThisMonth = month(ThisDate);
    ThisDay = day(ThisDate);
    NewDate = "#ThisYear##ThisMonth##ThisDay#";
    return NewDate;
}

</cfscript>

Ответы [ 5 ]

6 голосов
/ 16 ноября 2011

Сначала найдите, кто когда-либо делал базу данных, и пинайте их в надс ...

Лично я бы конвертировал с sql, поэтому мой код имел дело только с объектами даты.

Select Convert(DateTime, Convert(VarChar(8),DateTimeInventedByIdjitColumn))
From SomeTable

Как заявили наши коллеги, даты хранения в виде дат.

'08 / 06/2011 'может быть 8 июня 6 августа, в зависимости от локали.

20111643 является действительным целым числом..

Не использование правильного типа даты - это просто огромный набор функций и ошибок, которые в лучшем случае ожидают своего появления.

5 голосов
/ 16 ноября 2011

Вы можете переписать каждую функцию в 1 строку кода.

function createBrowserDate(ThisDate) {
  return mid(ThisDate,4,2) & "/" & right(ThisDate,2) & "/" & left(ThisDate,4);
}

и

function createDBDate(ThisDate) {
  return dateFormat( ThisDate, "YYYYMMDD" );
}
3 голосов
/ 16 ноября 2011

Не храните даты в виде строк - сохраняйте даты как даты и форматируйте их, когда вам нужно.

Если вы не можете исправить базу данных виспользуйте столбцы фактической даты (которые вы должны, если можете), затем вы можете использовать эти две функции для преобразования в / из ГГГГММДД и объекта даты:

function parseYMD( YYYYMMDD )
{
    if ( ! refind('^\d{8}$' , Arguments.YYYYMMDD ) )
        throw "Invalid Format. Expected YYYYMMDD";

    return parseDateTime
        ( Arguments.YYYYMMDD.replaceAll('(?<=^\d{4})|(?=\d{2}$)','-') );
}

function formatYMD( DateObj )
{
    return DateFormat( DateObj , 'yyyymmdd' );
}

Использование объектов даты означает, что любой уровень разработчика может работать с ними, не заботясь о форматировании, с помощью встроенных функций, таких как DateAdd , DateCompare и т. Д.

1 голос
/ 16 ноября 2011

Я не фанат регулярных выражений, так как он не так удобен для чтения.

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

Во-первых, сразу после чтения даты из БД я бы проанализировал ее для объекта Date, используя parseDBDate()

Date function parseDBDate(required String dbDate)
{
    var yyyy = left(dbDate, 4); 
    var mm = mid(dbDate, 4, 2);
    var dd = right(dbDate, 2);

    return createDate(yyyy , mm, dd);
}

Когда у вас есть объект даты, вы можете использовать все эти встроенные функции даты, такие как DateAdd() или DateDiff().

Позвоните browserDateFormat() прямо перед тем, как вам нужно отобразить его.

String function browserDateFormat(required Date date) 
{
    return dateFormat(date, "MM/DD/YYYY");
}

Позвоните dBDateFormat() внутрь <cfqueryparam value="">, когда придет время сохранить данные в БД

String function dBDateFormat(required Date date) 
{
    return dateFormat(date, "YYYYMMDD");
}
0 голосов
/ 18 ноября 2011

Один лайнер:)

myDateString = "20110203";

myCfDate = createObject("java","java.text.SimpleDateFormat").init("yyyyMMdd").parse(myDateString,createObject("java","java.text.ParsePosition").init(0*0));

Если вы хотите проанализировать разные шаблоны, измените "yyyyMMdd" на любой другой поддерживаемый шаблон.

http://download.oracle.com/javase/1.5.0/docs/api/java/text/SimpleDateFormat.html

ParsePosition используется, чтобы сказать, где начать синтаксический анализ строки. 0 * 0 - это сокращение для JavaCast ("int", 0) - в движке Adobe cf 0 - это строка, пока вы не примените к ней математические вычисления, затем она станет Double, которую поддерживает конструктор ParsePosition. Технически, он конструируется с int, но cf достаточно умен, чтобы понизить Double до int.

http://download.oracle.com/javase/1.5.0/docs/api/java/text/ParsePosition.html

...