myślałem nad swoim problemem i nie jest to aspekt, że brakowało mi wczoraj. Pomyślałem, że funkcja Format
nie ma sensu, ale nawet jeśli wygląda dziwnie, może mieć sens. Pozwól mi wyjaśnić.
W VB6 mamy
tAvailableDate = DateAdd("d", 21, Format(Now, gDATEFORMAT))
Dlaczego to wygląda dziwnie (lub nawet źle)? Now
to Date
. Format
zamienia tę datę na String
(oraz na Variant
zawierającą dokładnie String
), ale DateAdd
potrzebuje parametru Date
, aby móc dodać dni. DateAdd
jest zadeklarowana następująco:
Function DateAdd(Interval As String, Number As Double, Date)
Zamiast dawać ostrzeżenie lub błąd kompilatora, VB6 dyskretnie konwertuje ten ciąg z powrotem do Date
i przekazuje go do DateAdd
. Więc moim pierwszym założeniem było po prostu upuścić ten Format
.
ALE ten Format
może mieć pożądany efekt na wyniku, w zależności od tego, jak zdefiniowano gDATEFORMAT
. Jeśli gDATEFORMAT
zawiera tylko część daty, funkcja formatowania spowoduje zrzucenie części czasu!Jednak może to być po prostu osiągnąć za pomocą funkcji Date
zamiast używania funkcji Now
w VB6
tAvailableDate = DateAdd("d", 21, Date)
lub DateTime.Today
w .NET (C# lub VB.NET).
Ale gDATEFORMAT
może zawierać tylko miesiąc i rok. VB6 (używając mojego szwajcarskiego locale):
Date ==> 27.06.2012
Format(Date,"MM.yyyy") ==> "06.2012"
CDate(Format(Date,"MM.yyyy")) ==> 01.06.2012
Jak widać, formatowanie daty miałoby skutek powrotu pierwszego dnia bieżącego miesiąca w tym przypadku. Dodając 21 dni, zawsze otrzymasz 22 dnia bieżącego miesiąca. To zupełnie coś innego niż dodanie 21 dni do bieżącej daty! W języku C# można osiągnąć to samo z
DateTime today = DateTime.Today;
tAvailableDate = new DateTime(today.Year, today.Month, 22);
w celu stwierdzenia, które podejście jest poprawne, trzeba albo znać co gDATEFORMAT
zawiera lub, jeżeli jest to zmienna, formatować datę i następnie zanalizować wynikowy ciąg, aby uzyskać Data ponownie.
Co próbujesz osiągnąć? Jeśli możesz nam to powiedzieć, potrzebujesz tylko ludzi, którzy znają .NET, a nie ludzi, którzy znają .NET * i * VB6. –