Frage

Kennt jemand eine Möglichkeit, eine Datumskonstante zu deklarieren, die mit internationalen Datumsangaben kompatibel ist?

Ich habe es versucht:

' 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)
War es hilfreich?

Lösung

Wenn Sie sich die IL sehen durch die Aussage erzeugt

public const ADate as Date = #12/31/04#

Sie werden sehen:

.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 )

Beachten Sie, dass die DateTimeConstantAttribute is being mit einem Konstruktor initialisiert, die eine int64 Taktzählung nimmt. Da diese Taktzählung bei complile Zeit bestimmt wird, scheint es unwahrscheinlich, dass eine Lokalisierung ins Spiel kommt, wenn dieser Wert zur Laufzeit initialisiert wird. Meine Vermutung ist, dass der Fehler mit einer anderen Datum Handhabung in Ihrem Code, nicht die const Initialisierung.

Andere Tipps

Nach der Dokumentation von Microsoft,

"Sie müssen einen Datumsliteral innerhalb Nummernzeichen einschließen (# #). Sie müssen den Datumswert im Format M / d / yyyy angeben, zum Beispiel # 5/31/1993 #. Diese Anforderung an Ihrem Ort unabhängig sind und des Computers Datums- und Uhrzeitformat-Einstellungen. "

Wollen Sie damit sagen, dass dies nicht richtig ist und das Parsen von den aktuellen Locale betroffen ist?

Edit:? Haben Sie versucht, mit einem 4-stelligen Jahr

Wenn Sie Daten in Date-Objekte in VB haben, müssen Sie sich keine Gedanken über die Globalisierung kümmern, bis Sie etwas, um es zu vergleichen, oder versuchen, es zu exportieren.

Das ist in Ordnung:

Dim FirstDate as Date = Date.UtcNow() 'or this: = NewDate (2008,09,10)'
Dim SecondDate as Date

SecondDate = FirstDate.AddDays(1)

Dies zieht in der Globalisierung Regeln und Druck im Kultur Format der aktuellen Threads:

HeaderLabel.Text = SecondDate.ToString()

Das ist schlecht:

Dim BadDate as Date = CDate("2/20/2000")

Eigentlich - auch das ist in Ordnung, wenn Sie CDate zwingen, in diesem Fall das Recht, Kultur zu verwenden (InvariantCulture):

Dim OkButBadPracticeDate as Date = CDate("2/20/2000", CultureInfo.InvariantCulture)

Wenn Sie alles auf eine bestimmte Kultur zwingen wollen, müssen Sie die ausführende Thread Kultur und UI-Kultur auf die gewünschte Kultur einzustellen (en-US, invariant, usw.).

Stellen Sie sicher, dass Sie keine Arbeit mit Daten als Strings nicht tun - stellen Sie sicher, sie tatsächlich Date-Objekte sind

Ok Recht, ich verstehe mehr, wo Sie kommen ..

Wie wäre:

  • Erstellen Sie eine statische Methode, die das Datum Konstante zurückgibt. Dies überwindet das internationale Thema, da es als spezifischen Datetime-Wert zurückgegeben wird.
  • Ich erinnere mich jetzt optional params von meiner VB6 Tage, aber können Sie nicht nur die Methode überlasten? Wenn Sie die überladene Methode ohne Datum verwenden, nur ziehen Sie es aus dem statischen?

EDIT:. Wenn Sie nicht sicher sind, was ich meine, und würde ein Codebeispiel mag, gerade diesen Beitrag kommentieren, und ich werde chuck ein auf

OK, ich bin nicht sicher, was Sie versuchen, hier zu tun:

  • Der Code, den Sie eine Mitteilung verfassen, wird nicht .NET, versuchen Sie zu portieren?
  • Datetime ist nicht als Konstanten deklariert werden.
  • Datetime ist ein Datentyp, so einmal init'ed, das Format, das sie von irrelevanten init'ed wurden ist.
  • Wenn Sie einen konstanten Wert benötigen, dann erstellen Sie einfach eine Methode, um immer die gleiche Datetime zurück.

Zum Beispiel:

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

Update

Wo zum Teufel sind Sie alles, was immer aus?

scroll top