【问题标题】:Converting date to indonesian locale swaps day with month将日期转换为印度尼西亚语言环境交换日期与月份
【发布时间】:2014-07-31 06:29:45
【问题描述】:

考虑以下日期条目。我想要输入字符串和输出字符串的 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)。

【问题讨论】:

    标签: date locale railo


    【解决方案1】:

    问题在于传递给 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)') />
    

    【讨论】:

    • 您是否有声称字符串日期始终以美国格式传递的消息来源?我原以为那会是在 Railo 或 JVM 中设置的东西
    • 抱歉,我没有任何“确凿”证据。不过我只是玩了一下。如果您设置“有效”语言环境,似乎您可以更改行为。我已经相应地更新了我的答案。谢谢你让我看看这个。 :)
    • 看起来印度尼西亚语言环境有 4 个可能的字符串:indonesian / inindonesian (indonesia) / in_id。只有最后 2 个正确设置了日期输入,我怀疑前 2 个根本没有做任何事情,因为它们看起来像美国语言环境。 indonesian / in 语言环境“无效”吗?我不知道,但它没有按预期工作。
    • 其他用户请注意:我接受了这个答案,但阅读了包括 cmets 在内的所有内容,因为只有 UPDATE 部分回答了这个问题。对于这种情况,UDF 是多余的。
    猜你喜欢
    • 2019-09-21
    • 1970-01-01
    • 2021-01-27
    • 2014-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多