3

DateFormat 関数を使用して、日付をこの形式に変換しています: yyyy-mm-dd. これは、日付の元の形式です: dd-mm-yyyy. 以下はコードのスニペットです。

<cfset newdate = #DateFormat(Trim(mydate), "yyyy-mm-dd")# />

問題は、日付ごとに異なる結果が得られることです。例えば:

  • 元の日付が 15-05-2013( dd-mm-yyyy )の場合
  • 結果は次のとおりです: 2013-05-15( yyyy-mm-dd )

ただし、入力を変更すると:

  • 元の日付: 01-05-2013( dd-mm-yyyy )
  • 結果は次のとおりです: 2013-01-05( yyyy-dd-mm )

何が間違っているかについての助けやガイダンスをいただければ幸いです。

4

2 に答える 2

8

私は他の答えに同意しません。この問題の本当の原因は、DateFormat が米国以外の日付文字列を処理するように設計されていないことです。

標準の CF 日付関数では、常に米国の日付解析規則が使用されます。つまり、 のようなあいまいな日付文字列を渡すと、米国英語の日付規則01-05-2013に従って解析されます。この場合、月が最初、つまり「mm-dd-yyyy」です。したがって、結果は常に 5 月 1 日ではなく 1 月 5 日になります。

場合によっては幸運に恵まれます。文字列15-05-2013では明らかに 15 番目の月がないため、CF/java はエラーをスローするのではなく、月と日を自動的に交換する必要があります。そのため、一部の日付文字列を正しく処理しているように見えdd-mm-yyyyますが、他の日付文字列は正しく処理していないようです。

米国以外の日付文字列を解析する場合は、代わりに LS (Locale Sensitive) 日付関数を使用する必要があります。ただし、ドキュメントによると、ダッシュ ie"-"は米国以外のほとんどのロケールでは標準の日付区切り記号ではありません: オランダ語とポルトガル語 (標準) のみです。そのため、区切り文字を変更するか、日付を解析するときにこれらの 2 つのロケールのいずれかを使用する必要があります。

        lsDateFormat( myDate, "yyyy-mm-dd", "pt_PT")

サイドノート:

余談ですDateFormatが、日付オブジェクトが必要です。ただし、CF のほとんどの関数と同様に、日付文字列も受け入れる柔軟性があります。これにより、日付文字列=> 日付オブジェクト=> から (フォーマットされた) 日付文字列に再び変換するための遅延ショートカットとして使用できます。日付オブジェクトを使用することをお勧めします (実際には日付文字列も検証する必要があります) が、それはまったく別の会話です ...

于 2013-05-15T15:34:39.460 に答える