将日期转换为印度尼西亚语语言环境与月份交换日期

时间:2014-07-31 06:29:46

标签: date locale railo

考虑以下日期条目。我想要DD/MM/YYYY格式的输入字符串和输出字符串

<cfset SetLocale('indonesian') /> <!--- also set in Railo Admin --->
<cfdump var="#GetLocale()#" />
<cfdump var="#LSDateFormat('01/07/2014', 'dd/mm/yyy')#" />
<cfdump var="#LSDateFormat('31/07/2014', 'dd/mm/yyy')#" />
<cfdump var="#LSDateFormat(Now())#" />

输出:

string  in             <--- correct for 'indonesian'?
string  07/01/2014     <--- wrong
string  31/07/2014     <--- correct... maybe
string  31/07/2014     <--- correct... maybe

印度尼西亚使用DD/MM/YYYY格式,但Railo似乎将日期输入字符串视为美国日期,除非它“无效”(美国月份高于12)。

操作系统区域设置为:LC_TIME="en_AU.UTF-8"(澳大利亚)。此区域设置也使用DD/MM/YYYY

所以我认为没有什么可以指定美国日期格式,并且我正在使用函数的LS变体,为什么我的日期输入字符串被解释为美国日期?

实际上我真的不喜欢基于MM值的DD / MM更改语言环境。我正在寻找一个实际验证日期为DD/MM/YYYY的答案(最好使用内置的东西而不是UDF)。

1 个答案:

答案 0 :(得分:0)

问题是传递给lsDateFormat函数的日期应该是一个日期对象。如果传入字符串,coldfusion将尝试将字符串转换为日期对象。假设使用美国日期格式,此自动转换将执行此操作。

您可以使用createDate函数创建日期来测试。您可以快速构建自己的日期解析功能,我在下面找到了一个样本:

注意:在完整的解决方案中,您必须检查函数的响应是否为未知日期并采取相应的行动。

<cfset SetLocale('indonesian') /> <!--- also set in Railo Admin --->
<cfdump var="#GetLocale()#" />
<cfdump var="#LSDateFormat('01/07/2014', 'dd/mm/yyy')#" />
<cfdump var="#LSDateFormat('31/07/2014', 'dd/mm/yyy')#" />
<cfdump var="#LSDateFormat(Now())#" />

<!--- Now with creating date objects--->
<cfdump var="#LSDateFormat(createDate(2014,07,01), 'dd/mm/yyy')#" />

<!--- Using our own date parser--->
<cfdump var="#LSDateFormat(udf_parseDate('01/07/2014'), 'dd/mm/yyyy')#" />
<cfdump var="#LSDateFormat(udf_parseDate('31/07/2014'), 'dd/mm/yyyy')#" />


<cffunction name="udf_parseDate" output="false" returntype="date">
<cfargument name="value" required="true" type="string">
<cfset var UNKNOWN_DATE = createDate(1900,1,1)>
<cfset var DELIMITER = "/">
<cfset var iDay = 0>
<cfset var iMonth = 0>
<cfset var iYear = 0>

<cftry>
    <cfset iDay = getToken(arguments.value,1,DELIMITER)>
    <cfset iMonth = getToken(arguments.value,2,DELIMITER)>
    <cfset iYear = getToken(arguments.value,3,DELIMITER)>

    <cfset tmp = createDate(iYear,iMonth,iDay)>

    <cfcatch type="any">
        <cfreturn UNKNOWN_DATE>
    </cfcatch>
</cftry>

<cfreturn tmp>
</cffunction>

我的建议是远离所有内置的本地化功能,而这些功能通常不会让人们按照需要在完全本地化的应用程序中工作的方式工作。特别是如果您需要同时支持多个语言环境。例如时区。

更新:

为了完整性和技术上更正确。

您正在设置的区域设置无效。有关可用语言环境的完整列表,请执行以下操作:

<cfdump var="#Server.coldfusion.supportedlocales#">

然后,您将看到正确的区域设置:

<cfset SetLocale('indonesian (indonesia)') />