2

Freemarker テンプレートが異なるマシンで異なる日付形式を生成するという問題があります。

私の Freemarker マクロは次のようになります。

<#macro renderTextEntry textEntry>
    <div id="text_entry_${textEntry.id}" class="text_entry">
        <span id="text_entry_${textEntry.id}_date" class="text_entry_date">${textEntry.time?datetime}</span>:
        <div id="text_entry_${textEntry.id}_content" class="text_entry_content"><#noescape>${textEntry.text}</#noescape></div>
        <button class="edit_text_entry">Edit</button>
        <a class="delete_text_entry" href="/delete-text-entry?id=${textEntry.id}"><img
                src="images/delete.png" alt="delete text entry"/></a>
    </div>
</#macro>

結果の単体テストがあり、予想される結果は次のとおりです。

<div id="text_entry_5" class="text_entry">
    <span id="text_entry_5_date" class="text_entry_date">Jan 2, 1970 11:17:36 AM</span>:
    <div id="text_entry_5_content" class="text_entry_content">some text</div>
        <button class="edit_text_entry">Edit</button>
        <a class="delete_text_entry" href="/delete-text-entry?id=5">
            <img src="images/delete.png" alt="delete text entry"/>
        </a>
</div>

1 台 1 台のマシンで、このテストに合格します。別の方法では、失敗します。唯一の違いは、日付が次のように出力されることです。

02-Jan-1970 11:17:36

TextEntry.getDate() は、java.util.Date オブジェクトを返します。

どちらのマシンも、OSX 10.7.5 および Java 1.7.0_10-b18 を実行する MacbookPro です。デフォルトの DateFormat に影響を与える、設定した環境変数を認識していません-単に実行しています

System.out.println(new Date());

両方のマシンで同じ出力を生成します。ここで何が起こっているのかわかりません - どんな助けでも大歓迎です!

注:必要な日付形式を明示的に宣言することで問題を解決しました-関連するFreemarkerスニペットは現在

${textEntry.time?string("MMM d, yyyy HH:mm:ss a")}

ただし、ここで何が起こっているのかを理解しておくとよいでしょう。

4

2 に答える 2

2

他のコンピューターで別のブラウザー言語を使用している可能性がありますか?

私の知る限り、デフォルトの日付形式は、使用されているロケールによって異なります。

于 2012-12-23T18:59:45.420 に答える
2

日付/時刻の形式は国籍によって異なるため、FreeMarker のデフォルトの日付/時刻の形式は FreeMarker のlocale設定に依存します。FreeMarker の設定については、 http: //freemarker.org/docs/pgui_config_settings.htmlを参照してください。ご覧のとおり、locale設定はさまざまなレベルで指定できますが、テンプレートの外部で行うことが望ましいです。アプリケーションが国際化されていない場合は、おそらく FreeMarkerConfigurationオブジェクトでsetLocale(Locale). Environmentそれ以外の場合は、現在の訪問者のロケールに適合するように、レベルで同じことを行う必要があります。

どこにも指定していないのでlocale、FreeMarker は Java によって選択されたデフォルトのロケールを使用しました。これは通常、OS (Web サーバー) のデフォルトのロケールです。の時点ではDate.toString、主にデバッグ用であり、プログラマの目向けであるため、ロケールは無視されます。そのため、常に同じものが出力されます。

ロケールに関連付けられた形式が依然として希望どおりでない場合は、日付と時刻の形式を FreeMarker の および設定でdate_formattime_format調整できることに注意してください。datetime_format使用?string('...')は最後の手段にすぎません。

于 2012-12-23T23:16:17.077 に答える