Как определить является ли строка датой?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Gmp
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 68
Зарегистрирован: 22.07.2006 (Сб) 17:04
Откуда: Германия

Как определить является ли строка датой?

Сообщение Gmp » 08.08.2006 (Вт) 13:36

Собственно вопрос. Дата в формате дд.мм.гггг

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 08.08.2006 (Вт) 13:42

Если текущей датой, тогда просто сравнить строку и Date
#define ROFL 0xDDDD

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 08.08.2006 (Вт) 13:48

Сделать CDate и ловить ошибку.
Изображение

Gmp
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 68
Зарегистрирован: 22.07.2006 (Сб) 17:04
Откуда: Германия

Сообщение Gmp » 08.08.2006 (Вт) 13:58

DirectXManiac
Нет даты разные.
keks-n
А более цивилизованые методы есть? :)

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 08.08.2006 (Вт) 14:07

Есть менее цивилизованные, потому что даже метод отлова ошибки cdate может не проканать. Пример: CDate("2343423") = 27.01.8316

Вот так будет правильнее:
Код: Выделить всё
On Error Resume Next
r=(Format(CDate(s), "dd.mm.yyyy") = s)
If Err.Number = 0 and r Then 'это таки дата
Лучший способ понять что-то самому — объяснить это другому.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 08.08.2006 (Вт) 14:09

Хотя я вспомнил, существует же функция IsDate...
Лучший способ понять что-то самому — объяснить это другому.

Gmp
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 68
Зарегистрирован: 22.07.2006 (Сб) 17:04
Откуда: Германия

Сообщение Gmp » 08.08.2006 (Вт) 14:21

Antonariy
Во IsDate то что нужно! Спасибо.

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 08.08.2006 (Вт) 17:02

На всякий случай - автору топика IsDate, видимо, подойдет. Но в общем случае эта функция считает датами некоторые весьма сомнительные строки, например, IsDate("12.31")=True (и IsDate("31.12")=True).
Быть... или не быть. Вот. В чём вопрос?

Dummiel
Бывалый
Бывалый
 
Сообщения: 235
Зарегистрирован: 11.06.2004 (Пт) 9:15
Откуда: Алтай

Сообщение Dummiel » 09.08.2006 (Ср) 8:30

В дополнение к предыдущему посту:
Вот я один раз жестко обжегся с этой IsDate: как она определяет 12.13.2006 и 13.12.2006? И то, и то = True.

Oxygen
Белая и пушистая
Белая и пушистая
Аватара пользователя
 
Сообщения: 1314
Зарегистрирован: 15.07.2003 (Вт) 7:14
Откуда: Москва

Сообщение Oxygen » 09.08.2006 (Ср) 10:39

Она считает датами все, что к датам можно преобразовать.
2Dummiel В твоем случае IsDate узрела во втором варианте дату в американском формате.

Как вариант все же проверять дату ручками, хотя бы на количество месяцев перед тем, как скармливать ее IsDate.
Процедура клонирования завершена.
Коррекция имплантированного сознания соответствует принятым алгоритмам.
Уникальный идентификатор скопирован в чип временного паспорта.
Активация прав гражданина ожидается в течение 24 часов

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 09.08.2006 (Ср) 11:04

В общем 100% правильный результат дает только мой способ.
Лучший способ понять что-то самому — объяснить это другому.

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 09.08.2006 (Ср) 11:41

Ну, про "только" - это ты загнул, конечно... :D
Быть... или не быть. Вот. В чём вопрос?

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 09.08.2006 (Ср) 12:19

Альтернативы?
Лучший способ понять что-то самому — объяснить это другому.

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 09.08.2006 (Ср) 13:00

Альтернатива - геморные проверки подстрок, отвечающих за день, месяц и год - являются ли они таковыми. Я не говорю, что есть вариант лучше, во всяком случае, я такой пока не придумал, но твой вариант точно не единственный. А вообще, это я так, к слову придрался :)
Быть... или не быть. Вот. В чём вопрос?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 09.08.2006 (Ср) 14:28

Oxygen писал(а):Она считает датами все, что к датам можно преобразовать.
2Dummiel В твоем случае IsDate узрела во втором варианте дату в американском формате.

В американском формате -- это 12/13/2006
Впрочем, про неё IsDate тоже говорит True.
Как и про 13/12/2006, которая совсем в неведомом формате.
Изображение

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 11.08.2006 (Пт) 15:40

tyomitch писал(а):Как и про 13/12/2006, которая совсем в неведомом формате.

Будете смеяться, но такой формат действительно существует и вполне себе ведом. Это Хиджри - 131 формат функции Convert() в T-SQL :).

На самом же деле, конечно, достаточно было посмотреть определение понятия date expression, чтобы все стало понятно:

MSDN писал(а):Any expression that can be interpreted as a date, including date literals, numbers that look like dates, strings that look like dates, and dates returned from functions. A date expression is limited to numbers or strings, in any combination, that can represent a date from January 1, 100 – December 31, 9999.

Болд мой. Так что, если нужно строгое определение, с учетом допустимых разделителей и различением порядка перечисления частей, то только вручную.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 11.08.2006 (Пт) 16:55

uhm писал(а):На всякий случай - автору топика IsDate, видимо, подойдет. Но в общем случае эта функция считает датами некоторые весьма сомнительные строки, например, IsDate("12.31")=True (и IsDate("31.12")=True).


Что в них сомнительного? Я так дату и ввожу. Ибо нафига текущий год каждый раз набирать?
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 14.08.2006 (Пн) 11:18

Для некоторых случаев - "1.1" - это не "первое января текущего года", а "одна целая одна десятая" :) Или даже "пункт 1.1".
Быть... или не быть. Вот. В чём вопрос?

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 14.08.2006 (Пн) 22:46

uhm писал(а):Для некоторых случаев - "1.1" - это не "первое января текущего года", а "одна целая одна десятая" :) Или даже "пункт 1.1".
Ну так если пользователь в поле для даты ввел "одну целую, одну десятую", то это смело можно рассматривать как первое января. Иначе, если он введет в поле для даты 05.05.2005, то он скажет, что он хотел ввести не пятое мая, а Пункт 05.05... и тут уж никакая IsDate не поможет.
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 15.08.2006 (Вт) 12:33

Не спорю :) Но пользователь - это не единственное "устройство ввода"... :lol:
Быть... или не быть. Вот. В чём вопрос?

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 15.08.2006 (Вт) 13:35

uhm писал(а):Не спорю :) Но пользователь - это не единственное "устройство ввода"... :lol:

Зато самое недокументированное


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 48

    TopList  
cron