将八位数转换为日期的最有效方法是什么?

时间:2011-11-16 18:14:53

标签: date coldfusion coldfusion-9

我正在使用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 个答案:

答案 0 :(得分:6)

首先找到谁做过数据库并把它们踢进了nads ......

我个人用sql转换所以我的代码只处理日期对象。

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

正如我们的同行所述,将日期存储为日期。

根据当地情况,'08 / 06/2011'可能是8月6日的8月8日。

20111643是一个有效的整数..

不使用正确的日期类型只是一大堆功能和错误,最多等待发生。

答案 1 :(得分:5)

您实际上可以将每个函数重写为一行代码。

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

function createDBDate(ThisDate) {
  return dateFormat( ThisDate, "YYYYMMDD" );
}

答案 2 :(得分:3)

不要将日期保留为字符串 - 将日期保留为日期 ,并在需要时将其格式化。

如果您无法更正数据库以使用实际日期列(如果可以,则应该使用),那么您可以使用这两个函数转换为/从YYYYMMDD和日期对象:

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' );
}


通过使用日期对象,这意味着任何级别的开发人员都可以使用它们,而无需关心格式化,通过内置函数,如DateAddDateCompare等。

答案 3 :(得分:1)

我不是正则表达爱好者,因为它对我来说不可读。

由于你正在使用CF9,我输入了参数并指定函数的返回类型,以便下一个人拿起你的代码更具可读性。

首先,在我从数据库中读取日期之后,我使用parseDBDate()

将其解析为Date对象
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");
}

答案 4 :(得分:0)

一个班轮:)

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