.NET Date Const (グローバリゼーションあり)
質問
国際日付と互換性のある日付定数を宣言する方法を知っている人はいますか?
私はもう試した:
' not international compatible
public const ADate as Date = #12/31/04#
' breaking change if you have an optional parameter that defaults to this value
' because it isnt constant.
public shared readonly ADate As New Date(12, 31, 04)
解決
ステートメントによって生成された IL を見ると、
public const ADate as Date = #12/31/04#
これが表示されます:
.field public static initonly valuetype [mscorlib]System.DateTime ADate
.custom instance void [mscorlib]System.Runtime.CompilerServices.DateTimeConstantAttribute::.ctor(int64) = ( 01 00 00 C0 2F CE E2 BC C6 08 00 00 )
注目してください。 DateTimeConstantAttribute int64 ティック カウントを受け取るコンストラクターで初期化されています。このティック数はコンパイル時に決定されるため、この値が実行時に初期化されるときにローカリゼーションが行われる可能性は低いと思われます。私の推測では、エラーはconstの初期化ではなく、コード内の他の日付処理にあると思います。
他のヒント
Microsoft のドキュメントによると、
「日付リテラルはシャープ記号 (# #) で囲む必要があります。日付値は M/d/yyyy の形式で指定する必要があります (例: #5/31/1993#)。この要件は、ロケールやコンピュータの日付と時刻の形式設定とは無関係です。」
これは正しくなく、解析が現在のロケールの影響を受けるということでしょうか?
編集: 4桁の年を試してみましたか?
VB の Date オブジェクトにデータを格納したら、それと何かを比較したり、エクスポートしたりするまでは、グローバリゼーションについて心配する必要はありません。
これは問題ありません:
Dim FirstDate as Date = Date.UtcNow() 'or this: = NewDate (2008,09,10)'
Dim SecondDate as Date
SecondDate = FirstDate.AddDays(1)
これにより、グローバリゼーション ルールが取り込まれ、現在のスレッドのカルチャ形式で出力されます。
HeaderLabel.Text = SecondDate.ToString()
これは悪いです:
Dim BadDate as Date = CDate("2/20/2000")
実際には、その場合に CDate に適切なカルチャ (InvariantCulture) を使用するように強制すれば、それでも問題ありません。
Dim OkButBadPracticeDate as Date = CDate("2/20/2000", CultureInfo.InvariantCulture)
すべてを特定のカルチャに強制したい場合は、実行スレッド カルチャと UI カルチャを目的のカルチャ (en-US、インバリアントなど) に設定する必要があります。
日付を文字列として操作していないことを確認してください。日付が実際の Date オブジェクトであることを確認してください。
わかりました、あなたの出身地がよくわかりました。
どうでしょうか:
- 日付定数を返す静的メソッドを作成します。これにより、特定の DateTime 値として返されるため、国際的な問題が解決されます。
- VB6 時代のオプションのパラメータを思い出しましたが、メソッドをオーバーロードすることはできないでしょうか?日付なしでオーバーロードされたメソッドを使用している場合は、静的メソッドから取得するだけです。
編集: 私の言っていることがよく分からず、コードサンプルが必要な場合は、この投稿にコメントしてください。サンプルを提供します。
OK、ここで何をしようとしているのかわかりません:
- あなたが投稿しているコードは ない .NET、移植しようとしていますか?
- DateTime は定数として宣言できません。
- DateTime はデータ型であるため、一度初期化されると、初期化された形式は関係ありません。
- 定数値が必要な場合は、常に同じ DateTime を返すメソッドを作成するだけです。
例えば:
public static DateTime SadDayForAll()
{
return new DateTime(2001, 09, 11);
}
アップデート
一体どこからそんなものを手に入れているのですか?
- そこには は C# と VB.NET の違いを説明します。これはそのうちの 1 つを強調しています。
- 日付 ではありません .NET データ型 - 日付時刻 は。
- VB.NET で DateTime 定数を作成できるようですが、制限があります
- から const を作成できないため、このメソッドはあなたを助けるためにありました。 変数 (すなわち、オプションのパラメータ)。それすら意味がありません。