Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Date 将八位数字转换为日期的最有效方法是什么?_Date_Coldfusion_Coldfusion 9 - Fatal编程技术网

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

Date 将八位数字转换为日期的最有效方法是什么?,date,coldfusion,coldfusion-9,Date,Coldfusion,Coldfusion 9,我正在使用ColdFusion 9.0.1和一些我无法更改的数据库 我正在访问一个数据库,该数据库将日期存储为8位数字,小数点后零位,如下所示: YYYYMMDD 我需要能够读取日期,从日期中加减天数,并创建新日期。我正在寻找一个ColdFusion解决方案来高效地(不需要太多代码)将日期转换为我们的标准格式,即 MM/DD/YYYY 然后将其转换回数据库的格式进行保存 我需要以一种非ColdFusion程序员可以轻松阅读并使用它的方式来编写代码,复制并修改它以用于其他功能(例如在日期中添加

我正在使用ColdFusion 9.0.1和一些我无法更改的数据库

我正在访问一个数据库,该数据库将日期存储为8位数字,小数点后零位,如下所示:

YYYYMMDD
我需要能够读取日期,从日期中加减天数,并创建新日期。我正在寻找一个ColdFusion解决方案来高效地(不需要太多代码)将日期转换为我们的标准格式,即

MM/DD/YYYY
然后将其转换回数据库的格式进行保存

我需要以一种非ColdFusion程序员可以轻松阅读并使用它的方式来编写代码,复制并修改它以用于其他功能(例如在日期中添加一天)。因此,我不是在寻找数量最少的代码,而是高效且可读的代码

您能提出一些建议,使这个代码块更灵活、更可读或更高效(更少的代码)吗


//为浏览器设置数据库日期格式
DateFromDB=“20111116”;
DatedToBrowser=createBrowserDate(DateFromDB);
写输出(DatedToBrowser);
函数createBrowserDate(ThisDate){
本年=左(本日期,4);
本月=月中(本月4日,2日);
ThisDay=右侧(ThisDate,2);
NewDate=createDate(今年、本月、本日);
NewDate=日期格式(NewDate,“MM/DD/YYYY”);
返回NewDate;
}
//为数据库设置浏览器日期格式
DateFromBrowser=“11/16/2011”;
DateToDB=createDBDate(DateFromBrowser);
书面文件(DateToDB);
函数createDBDate(ThisDate){
本年=本年(本日期);
ThisMonth=月份(ThisDate);
ThisDay=天(ThisDate);
NewDate=“#今年##本月##本日”;
返回NewDate;
}

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

如果无法将数据库更正为使用实际日期列(如果可以的话,应该这样做),则可以使用以下两个函数与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' );
}
已解析的函数(YYYYMMDD)
{
如果(!refind('^\d{8}$',Arguments.YYYYMMDD))
抛出“无效格式。应为YYYYMMDD”;
返回解析日期时间

(Arguments.YYYYMMDD.replaceAll(')(?您实际上可以将每个函数重写为一行代码

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


我不喜欢正则表达式,因为它对我来说不是那么可读

因为您使用的是CF9,所以我键入了参数并指定了函数的returntype,以便下一个使用您的代码的人更容易阅读

首先,在从DB读取日期之后,我会使用
parseDBDate()

拥有日期对象后,可以使用所有内置的日期function,如
DateAdd()
DateDiff()

在需要显示之前调用
browserDateFormat()

String function browserDateFormat(required Date date) 
{
    return dateFormat(date, "MM/DD/YYYY");
}
当需要持久化到数据库时,在
内部调用
dBDateFormat()

String function dBDateFormat(required Date date) 
{
    return dateFormat(date, "YYYYMMDD");
}

首先找到谁做过数据库,然后把他们踢进nads

就我个人而言,我会使用sql进行转换,因此我的代码只处理日期对象

Select Convert(DateTime, Convert(VarChar(8),DateTimeInventedByIdjitColumn))
From SomeTable
正如我们的同行所说,将日期存储为日期

“08/06/2011”可能是6月8日或8月6日,具体取决于地点

20111643是有效的整数

没有使用正确的日期类型只是大量的功能和错误的集合,充其量只是等待发生。

一行:)

如果要分析不同的模式,请将“yyyyMMdd”更改为任何其他受支持的模式

ParsePosition用于说明从何处开始解析字符串。 0*0是JavaCast(“int”,0)的简写形式-在Adobe cf引擎中,0是一个字符串,直到你对它应用数学运算,然后它变成一个双精度,ParsePosition构造函数支持它。从技术上讲,它使用int进行构造,但cf足够聪明,可以将双精度降级为int


我认为它现在非常可读,只是别忘了对那些函数中的变量进行Var。这里很挑剔……我会将NewDate=“#ThisYear##ThisMonth##ThisDay#”更改为NewDate=ThisYear&ThisMonth&ThisDay,但我讨厌代码中的无关散列标记。此外,您可能可以去掉createdate()和dateFormat()在第1个函数中,只需返回thisMonth&“/”&Thisday&“/”&ThisYear;实际上……再看看这个函数,您可以将createDBDate更改为只返回日期格式(ThisDate,“yyyyymmdd”)说得好!虽然这不是问题所要问的。而且由于DB date格式是
YYYYMMDD
,它至少是可排序的,
yyyydmm
很少在其他地方使用,所以不容易出错。如果您被迫对日期使用字符串格式,YYYYMMDD是最好的格式,但这并不意味着应该使用日期存储为字符串。在SQL阶段进行转换肯定是个好主意,而且比使用CFML函数更有意义,尽管我认为这里的示例代码假设为MS SQL Server?需要注意的是,不同的平台具有不同的转换函数,我们不知道OP使用的是哪一个。sla关于sql语法,我将提到我从现在开始使用的语法。我们倾向于使用yyy-MM-DD,这同样是通用的。当它溢出时,不能使用int,而不是将来的证明(grin)Peter,你说得很好。我之所以要求ColdFusion解决方案是因为我不知道正在使用的数据库。事实上,其他开发人员甚至都不知道。这是一个很大的谜。我的工作是为这些小问题创建ColdFusion解决方案。FWIW,我的正则表达式基本上是这样说的“在前四位数字之后的位置,或最后两位数字之前的位置,插入一个连字符”。只要你花点时间理解它,正则表达式就不难学了。:)谢谢你的信息!看起来你来自Java世界。是吗?有点。:)只需遵循CF的函数命名约定,使用
parseXXX()
XXXFormat()
我可能会使用throw()rat
String function browserDateFormat(required Date date) 
{
    return dateFormat(date, "MM/DD/YYYY");
}
String function dBDateFormat(required Date date) 
{
    return dateFormat(date, "YYYYMMDD");
}
Select Convert(DateTime, Convert(VarChar(8),DateTimeInventedByIdjitColumn))
From SomeTable
myDateString = "20110203";

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