我正在使用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>
答案 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' );
}
通过使用日期对象,这意味着任何级别的开发人员都可以使用它们,而无需关心格式化,通过内置函数,如DateAdd,DateCompare等。
答案 3 :(得分:1)
我不是正则表达爱好者,因为它对我来说不可读。
由于你正在使用CF9,我输入了参数并指定函数的返回类型,以便下一个人拿起你的代码更具可读性。
首先,在我从数据库中读取日期之后,我使用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");
}
答案 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