Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / валидация даты под любой локалью / 20 сообщений из 20, страница 1 из 1
28.05.2008, 18:52
    #35341219
валидация даты под любой локалью
всем привет.

суть проблемки: имеется некий алгоритм, поставляющий на выход 3 числа: день, месяц и год. Нужно выяснить, валидна ли составленная из них дата, напр.:

день = 1, месяц = 5, год = 2005 ---> дата верна
день = 31, месяц = 2, 2008 ---> дата неверна

DateSerial не подходит, поскольку ситуацию во 2-м примере он элементарно сконвертит в 3-е марта.

Преобразовывать в строку и проверять IsDate'ом? тут у меня большие сомнения от недостаточной информированности. Как преобразовать в строку, чтобы работало под любой локалью? Есть какой-нибудь "универсальный" формат для даты в VB? (наподобие yyyymmdd для sql server'а, если кто в курсе).

Поясню. Если я тупо преобразую в строку по типу cstr(день) + "." + cstr(месяц) + "." + cstr(год), то оно будет корректно отрабатывать, скажем, для русской и немецкой языковых настроек, но некорректно для американской (потому что там порядок дня и месяца другой) и для итальянской (потому что там разделители не точки, а слэши).

Вот. Заранее благодарен за советы.
...
Рейтинг: 0 / 0
28.05.2008, 19:49
    #35341343
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
валидация даты под любой локалью
В США тоже слэши, вообще-то. Чтобы узнать местный формат даты, можно поступить так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Option Explicit

Private Declare Function GetLocaleInfo Lib "kernel32" Alias "GetLocaleInfoA" (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String, ByVal cchData As Long) As Long
Const LOCALE_SDECIMAL = &HE
Private Const LOCALE_SSHORTDATE As Long = &H1F    'short date format string

Private Sub Form_Load()
    'get decimal sign
    Dim S As String
    
    S = Space$( 10 )
    GetLocaleInfo  0 , LOCALE_SDECIMAL, S, Len(S)
    S = Left$(S, InStr(S, vbNullChar) -  1 )
    
    MsgBox "Decimal Sign = " & S ' Заодно показал десятичный разделитель
    
     S = Space$(Date)
    GetLocaleInfo  0 , LOCALE_SSHORTDATE, S, Len(S)
    MsgBox "Short date = " & S 'дата в коротком формате локально
    
End Sub
...
Рейтинг: 0 / 0
28.05.2008, 19:56
    #35341353
валидация даты под любой локалью
VladConnВ США тоже слэши, вообще-то. Чтобы узнать местный формат даты, можно поступить так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Option Explicit

Private Declare Function GetLocaleInfo Lib "kernel32" Alias "GetLocaleInfoA" (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String, ByVal cchData As Long) As Long
Const LOCALE_SDECIMAL = &HE
Private Const LOCALE_SSHORTDATE As Long = &H1F    'short date format string

Private Sub Form_Load()
    'get decimal sign
    Dim S As String
    
    S = Space$( 10 )
    GetLocaleInfo  0 , LOCALE_SDECIMAL, S, Len(S)
    S = Left$(S, InStr(S, vbNullChar) -  1 )
    
    MsgBox "Decimal Sign = " & S ' Заодно показал десятичный разделитель
    
     S = Space$(Date)
    GetLocaleInfo  0 , LOCALE_SSHORTDATE, S, Len(S)
    MsgBox "Short date = " & S 'дата в коротком формате локально
    
End Sub


да, с США я слегка не подумав написал, но это уже детали.
спасибо за пример. Я могу, конечно, на крайняк разделители даты из текущей локали вытаскивать. И даже проверять, не американская ли стоит локаль, чтобы поменять местами день и месяц. Но надеялся, что есть простой и надежный способ, что называется, в 1 строчку. А то мало ли, вдруг есть страна, где год в начале пишут. Или где-нить еще по-американски дату форматируют.
...
Рейтинг: 0 / 0
28.05.2008, 20:02
    #35341366
Дык
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
валидация даты под любой локалью
Василий Пупкинпоставляющий на выход 3 числа: день, месяц и год
И чё?

Если есть уже три числа, созданные алгоритмом, дата из них уже будет валидна.
Имхо, автор, в добрых традициях, не понимает разницы между датой и строковым представлением даты.
...
Рейтинг: 0 / 0
28.05.2008, 20:15
    #35341390
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
валидация даты под любой локалью
Я вам показал простой и надежный способ
...
Рейтинг: 0 / 0
28.05.2008, 20:19
    #35341398
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
валидация даты под любой локалью
ДыкИ чё?
Если есть уже три числа, созданные алгоритмом, дата из них уже будет валидна.


Не факт.
...
Рейтинг: 0 / 0
28.05.2008, 20:20
    #35341399
валидация даты под любой локалью
ДыкИмхо, автор, в добрых традициях, не понимает разницы между датой и строковым представлением даты.

да понимаю я прекрасно.

авторЕсли есть уже три числа, созданные алгоритмом, дата из них уже будет валидна.

нет. Я, может, выразился неправильно. Алгоритм у меня - это, грубо говоря, клик по гриду размером 12 на 31. Берем и смотрим, в какой ячейке клик. Строка будет днем, столбец - месяцем. Год задан. Естественно, при этом могут быть кликнуты ячейки, соответствующиее несуществующим датам. Вот этот момент мне, грубо говоря, и надо отловить.
...
Рейтинг: 0 / 0
28.05.2008, 20:23
    #35341409
валидация даты под любой локалью
VladConnЯ вам показал простой и надежный способ

а вообще, да, действительно, че это я... просто заменить в форматной строке нахрен dd, mm и yy(yy) реплэйсом на нужные числа, и не мучиться.... Мерси.
...
Рейтинг: 0 / 0
28.05.2008, 20:25
    #35341411
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
валидация даты под любой локалью
Между прочим, в России раньше "по-американски" дату форматировали. Почитайте письма Гоголя: ноября, 13 дня ...
...
Рейтинг: 0 / 0
28.05.2008, 20:26
    #35341413
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
валидация даты под любой локалью
Василий Пупкин VladConnЯ вам показал простой и надежный способ

а вообще, да, действительно, че это я... просто заменить в форматной строке нахрен dd, mm и yy(yy) реплэйсом на нужные числа, и не мучиться.... Мерси.

My pleasure
...
Рейтинг: 0 / 0
28.05.2008, 20:29
    #35341418
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
валидация даты под любой локалью
Василий Пупкин ДыкИмхо, автор, в добрых традициях, не понимает разницы между датой и строковым представлением даты.

да понимаю я прекрасно.

авторЕсли есть уже три числа, созданные алгоритмом, дата из них уже будет валидна.

нет. Я, может, выразился неправильно...

Вы выразились абсолютно правильно.
...
Рейтинг: 0 / 0
29.05.2008, 12:22
    #35342641
Дык
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
валидация даты под любой локалью
Василий Пупкина вообще, да, действительно, че это я... просто заменить в форматной строке нахрен dd, mm и yy(yy) реплэйсом на нужные числа, и не мучиться.... Мерси.
Нафига?

Код: plaintext
1.
2.
dim dd as date
dd=dateserial(y,m,d)
if day(dd)<>d or month(dd)<>m or year(dd)<>y then oops
...
Рейтинг: 0 / 0
29.05.2008, 12:49
    #35342789
AndreyMp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
валидация даты под любой локалью
А не поясните. Зачем нужен какой то грид и потом геморой с ним, когда есть нормальные контролы, стандартные Calendar, DTPicker к примеру, из которых дата всегда валидна? Или Вы свой контрол пишите?
...
Рейтинг: 0 / 0
29.05.2008, 16:47
    #35343769
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
валидация даты под любой локалью
Дык
Нафига?

Код: plaintext
1.
2.
dim dd as date
dd=dateserial(y,m,d)
if day(dd)<>d or month(dd)<>m or year(dd)<>y then oops


А нафига? Цитирую: Дык "Если есть уже три числа, созданные алгоритмом, дата из них уже будет валидна."

И кроме того, этот ваш If будет генерировать ошибки, когда год, например, попадает в позицию дня. У вас там неразумно dd as date.

:0))
...
Рейтинг: 0 / 0
29.05.2008, 17:02
    #35343828
Дык
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
валидация даты под любой локалью
VladConnА нафига? Цитирую: Дык "Если есть уже три числа, созданные алгоритмом, дата из них уже будет валидна."
А прочитайте-ка ответ автора на это предположение. Из которого ясно, почему оно в случае автора неверно.

VladConnИ кроме того, этот ваш If будет генерировать ошибки, когда год, например, попадает в позицию дня. У вас там неразумно dd as date.:0))
Внимательно читайте топик, там есть авторАлгоритм у меня - это, грубо говоря, клик по гриду размером 12 на 31. Берем и смотрим, в какой ячейке клик. Строка будет днем, столбец - месяцем. Год задан. Естественно, при этом могут быть кликнуты ячейки, соответствующиее несуществующим датам. Вот этот момент мне, грубо говоря, и надо отловить. Потом прочитайте вдобавок авторDateSerial не подходит, поскольку ситуацию во 2-м примере он элементарно сконвертит в 3-е марта. Из которого совсем всё ясно. Что DateSerial-то подходит, просто надо проверить, что он не перевёл дни/месяцы вперёд (читайте справку по DateSerial об этом поведении). Это и проверяется в ифе.
...
Рейтинг: 0 / 0
29.05.2008, 17:05
    #35343850
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
валидация даты под любой локалью
Насчет генерирования ошибки - беру слова обратно. Эта функция (dateserial) имеет "подлый" норов - вместо ошибки генерирует смещяемую определенным образом дату.
...
Рейтинг: 0 / 0
29.05.2008, 17:09
    #35343862
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
валидация даты под любой локалью
Вы сначали утверждали, что дата будет всегда "валидна", а потом сами же проверяете ее на валидность, вот и все. Но идея ваша все равно мне нравится.

Успехов.
...
Рейтинг: 0 / 0
29.05.2008, 17:12
    #35343870
Дык
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
валидация даты под любой локалью
VladConnВы сначали утверждали, что дата будет всегда "валидна", а потом сами же проверяете ее на валидность, вот и все. Но идея ваша все равно мне нравится.
Просто в первый раз под валидностью я понимал отсутствие даты типа 84/78/0451, и что автору нужно убедиться в этом

Потом автор объяснил, почему так не бывает, и что имеет в виду под валидностью он.
...
Рейтинг: 0 / 0
29.05.2008, 17:27
    #35343937
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
валидация даты под любой локалью
ОК. "Валидность" даты - сложный вопрос. Есть техническая "валидность", есть бизнес-"валидность", есть "валидность" даты на клиенте vs на сервере, и т.д. Я, например, когда пишу приложение клиент - сервер, то оперирую обычно датой с сервера, чтобы клиент на баловАл. Если дать ему такую возможность (хотя иногда это и нужно), то появляется лазейка для шулерства. Просто об этом надо всегда помнить, иметь ввиду.

Успехов.
...
Рейтинг: 0 / 0
30.05.2008, 12:27
    #35345496
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
валидация даты под любой локалью
> Автор: Василий Пупкин
> всем привет.
>
> суть проблемки: имеется некий алгоритм, поставляющий на выход 3
> числа: день, месяц и год. Нужно выяснить, валидна ли составленная из них
> дата, напр.:

Хм,
тут
ту-же тему обсуждают. Как тебе их варианты?

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / валидация даты под любой локалью / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]