4

国際日付と互換性のある日付定数を宣言する方法を知っている人はいますか?

私はもう試した:

' 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)
4

5 に答える 5

6

ステートメントによって生成された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の初期化ではなく、コード内の他の日付処理にあると思います。

于 2008-09-12T17:56:53.523 に答える
4

マイクロソフトのドキュメントによると、

「日付リテラルは番号記号 (# #) で囲む必要があります。日付値は M/d/yyyy の形式で指定する必要があります (例: #5/31/1993#)。この要件は、ロケールやコンピューターの日付と時刻の形式の設定。」

これは正しくなく、解析は現在のロケールの影響を受けるということですか?

編集: 4桁の年で試しましたか?

于 2008-09-11T20:53:18.117 に答える
1

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 オブジェクトであることを確認してください。

于 2008-09-11T21:22:00.277 に答える
0

OK、ここで何をしようとしているのかわかりません。

  • 投稿しているコードは.NETではありません。移植しようとしていますか?
  • DateTimeを定数として宣言することはできません。
  • DateTimeはデータ型であるため、一度初期化されると、初期化された形式は関係ありません。
  • 定数値が必要な場合は、常に同じDateTimeを返すメソッドを作成するだけです。

例えば:

public static DateTime SadDayForAll()
{
    return new DateTime(2001, 09, 11);
}

アップデート

いったいどこからそれを手に入れているのですか?!

  • C#とVB.NETには違いがあり、これはそのうちの1つを強調しています。
  • Dateは.NETデータ型ではありません-DateTime.NETデータ型です。
  • VB.NETでDateTime定数を作成できるようですが、制限があります
  • 変数(つまり、オプションのパラメーター)からconstを作成することはできないため、このメソッドはあなたを助けるためにありました。それも意味がありません。
于 2008-09-11T20:17:50.243 に答える
0

わかりました、私はあなたがどこから来たのかをもっと理解しています..

どうですか:

  • 日付定数を返す静的メソッドを作成します。これにより、特定の DateTime 値として返されるため、国際的な問題が解決されます。
  • VB6 時代のオプションのパラメーターを思い出しましたが、メソッドをオーバーロードすることはできませんか? 日付なしでオーバーロードされたメソッドを使用している場合は、静的からプルするだけですか?

編集:私が何を意味するのかわからず、コード サンプルが必要な場合は、この投稿にコメントしてください。

于 2008-09-11T21:03:25.657 に答える