powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / валидация даты под любой локалью
20 сообщений из 20, страница 1 из 1
валидация даты под любой локалью
    #35341219
всем привет.

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

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

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

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

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

Вот. Заранее благодарен за советы.
...
Рейтинг: 0 / 0
валидация даты под любой локалью
    #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
валидация даты под любой локалью
    #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
валидация даты под любой локалью
    #35341366
Дык
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Василий Пупкинпоставляющий на выход 3 числа: день, месяц и год
И чё?

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


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

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

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

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

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

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

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

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

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

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

Вы выразились абсолютно правильно.
...
Рейтинг: 0 / 0
валидация даты под любой локалью
    #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
валидация даты под любой локалью
    #35342789
AndreyMp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А не поясните. Зачем нужен какой то грид и потом геморой с ним, когда есть нормальные контролы, стандартные Calendar, DTPicker к примеру, из которых дата всегда валидна? Или Вы свой контрол пишите?
...
Рейтинг: 0 / 0
валидация даты под любой локалью
    #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
валидация даты под любой локалью
    #35343828
Дык
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VladConnА нафига? Цитирую: Дык "Если есть уже три числа, созданные алгоритмом, дата из них уже будет валидна."
А прочитайте-ка ответ автора на это предположение. Из которого ясно, почему оно в случае автора неверно.

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

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

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

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

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

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


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