Работа с датой и временем

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Crack1
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 23.02.2003 (Вс) 22:28
Откуда: Russia

Работа с датой и временем

Сообщение Crack1 » 28.05.2007 (Пн) 13:55

:?:
Есть строка типа 25.03.07 19:55:12
Как получить общее количество секунд?

Или ещё вопрос.
Есть две строки 25.03.07 19:55:12 и 25.02.07 11:55:12
Как получить разницу дат в секундах?

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 28.05.2007 (Пн) 14:07

Есть строка типа 25.03.07 19:55:12
Как получить общее количество секунд?

От рождества Христова? :)

Есть две строки 25.03.07 19:55:12 и 25.02.07 11:55:12
Как получить разницу дат в секундах?

Код: Выделить всё
        Dim D1 As DateTime = DateTime.Parse("25.03.07 19:55:12")
        Dim D2 As DateTime = DateTime.Parse("25.02.07 11:55:12")
        MsgBox(Math.Abs(CType((D2 - D1), TimeSpan).Seconds))
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 28.05.2007 (Пн) 21:58

Только еще нужно текущую локаль даты учитывать, иначе если локаль системы en-us, а дата ru-ru, то будут проблемы.
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

Crack1
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 23.02.2003 (Вс) 22:28
Откуда: Russia

Сообщение Crack1 » 29.05.2007 (Вт) 5:15

Спасибо.
И ещё один вопрос:
Есть число, например, 1234567. Это секунды.
Как сделать из этих секунд дату и время?

lord0n
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 845
Зарегистрирован: 30.06.2005 (Чт) 9:55
Откуда: Moskow

Сообщение lord0n » 29.05.2007 (Вт) 9:56

Crack1 писал(а):Спасибо.
И ещё один вопрос:
Есть число, например, 1234567. Это секунды.
Как сделать из этих секунд дату и время?


попробуй dateadd
Теория - это когда что-то не работает и известно почему.
Практика - это когда что-то работает, но неизвестно почему.
Нам удалось совместить теорию с практикой, теперь ничего не работает и неизвестно почему.

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 29.05.2007 (Вт) 10:37

lord0n писал(а):
Crack1 писал(а):Спасибо.
И ещё один вопрос:
Есть число, например, 1234567. Это секунды.
Как сделать из этих секунд дату и время?


попробуй dateadd


неверный ответ, посмотри конструктор New DataTime
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 29.05.2007 (Вт) 10:40

Nord777

TotalSeconds, всётаки)
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 29.05.2007 (Вт) 14:45

Sebas
Да. Ошибочка вышла )
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Crack1
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 23.02.2003 (Вс) 22:28
Откуда: Russia

Сообщение Crack1 » 30.05.2007 (Ср) 6:09

Вот сегодня ночью преснилось такое:

Dim date1 As DateTime = "30.05.2007 11:00:00"
Dim date2 As DateTime = "30.05.2007 9:00:00"

MsgBox(DateDiff(DateInterval.Hour, date2, date1))

Это промежуток времени вычисляется.

Dim date3 As Int32 = 123456
Dim date4 As TimeSpan

date4 = TimeSpan.FromSeconds(date3)
MsgBox(date4.TotalHours)

А это как-то странно работает...

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 30.05.2007 (Ср) 7:14

Код: Выделить всё
        Dim date3 As Int32 = 8 * 60 * 60
        Dim date4 As TimeSpan

        date4 = TimeSpan.FromSeconds(date3)
        MsgBox(date4.TotalHours)

Что странного? Ответ - 8, как и полагается
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Crack1
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 23.02.2003 (Вс) 22:28
Откуда: Russia

Сообщение Crack1 » 30.05.2007 (Ср) 8:17

Результат странный получается, с запятой...

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 30.05.2007 (Ср) 12:34

Интересно а как думал будет выглядеть результат выраженный в часах?
8 часов + 5 секунд = 8,00138888888889 часов

тебе не кажется, что это настолько очевидно, что задавать такие вопросы просто стыдно? (если конечно ты не учишься во втором классе)
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Crack1
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 23.02.2003 (Вс) 22:28
Откуда: Russia

Сообщение Crack1 » 31.05.2007 (Чт) 4:49

Вот, ночью опять мысль посетила:

Dim date4 As TimeSpan
Dim res As String = ""

date4 = TimeSpan.FromSeconds(325)
res = date4.Hours & ":" & date4.Minutes & ":" & date4.Seconds

MsgBox(res)

Это уже интереснее. :) Из секунд получаем время, и возможно даже число.

Crack1
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 23.02.2003 (Вс) 22:28
Откуда: Russia

Сообщение Crack1 » 31.05.2007 (Чт) 8:08

Опять не так.
Немогу получиь меяц и год из количества секунд. вот. :(

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 31.05.2007 (Чт) 9:44

Crack1 писал(а):Опять не так.
Немогу получиь меяц и год из количества секунд. вот. :(


Добавь date4 к нужной дате и получешь месяц и число. Надеюсь, Ты понимаешь что для каждого года они может быть разными если ты отталкиваешься от секунд?
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

cooler
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 90
Зарегистрирован: 09.08.2004 (Пн) 4:58
Откуда: Che sity

Сообщение cooler » 07.08.2007 (Вт) 21:04

Только еще нужно текущую локаль даты учитывать, иначе если локаль системы en-us, а дата ru-ru, то будут проблемы.

можно поинтересоваться как ее учитывают. А то у меня как раз по ходу дела в этом проблема... Получаю из MSSQL дату дальше делаю так:
Код: Выделить всё
Last_Date = LOC_DS.Tables("LDS").Rows(0).Item(4)
Происходит смена местами месяца и дня а надо по видимому так:
Код: Выделить всё
Date.TryParse(Dd, d) или Date.TryParseExact() или Date.ParseExact()
Пробовал объявлять переменную того типа, который по подсказке требуется, а вот как ее заполнять...
Windows написанна с применением искусственного интеллекта. И как любое разумное существо старается работать как можно меньше :))

cooler
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 90
Зарегистрирован: 09.08.2004 (Пн) 4:58
Откуда: Che sity

Сообщение cooler » 09.08.2007 (Чт) 10:40

Вобщем нашел в мсдне, но все равно сейчас немного не получается. Вобщем ситуация такая: в вб локаль ru-ru, насколько я понимаю, а вот в SQL-сервере en-us, помоему... если делать без преобразований, то он дату и месяц меняет местами... вобщем подскажите когда какие преобразования делать
Windows написанна с применением искусственного интеллекта. И как любое разумное существо старается работать как можно меньше :))

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 09.08.2007 (Чт) 22:26

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

cooler
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 90
Зарегистрирован: 09.08.2004 (Пн) 4:58
Откуда: Che sity

Сообщение cooler » 10.08.2007 (Пт) 8:58

Нет, без преобразований неполучится, т.к. для записи в SQL бд дата берется из названия столбца в DataGridView.
да и
если делать без преобразований, то он дату и месяц меняет местами

Разве что создавать еще массив дат и связывать с колонками... но его придется делать динамическим... вобщем думаю, лучше всеже сделать с как-то с преобразованием
Сейчас я делаю так:при чтении из бд без преобразований
Код: Выделить всё
Last_Date = LOC_DS.Tables("LDS").Rows(index).Item(4)

При записи в нее
Код: Выделить всё
CommandSQL.CommandText = "update journal set ... where  journal.date_time='" + Date.ParseExact(results.Columns(e.ColumnIndex).Name.ToString, "dd.M.yyyy", Globalization.CultureInfo.GetCultureInfo("en-us")).ToString + "'"

Даты теперь отображаются причем и тут и тут одинаково, но при добавлении, например, "13.12.2007" он возвращает ошибку что-то типа Date out of range :(
Windows написанна с применением искусственного интеллекта. И как любое разумное существо старается работать как можно меньше :))

Thomas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 246
Зарегистрирован: 12.11.2005 (Сб) 0:17
Откуда: "Сказочное королевство"

Сообщение Thomas » 11.08.2007 (Сб) 0:56

cooler
но при добавлении, например, "13.12.2007" он возвращает ошибку что-то типа Date out of range Sad

Конечно студия ругается, 13-го месяца, в отличии от 13-го числа, не существует.

Начинай "шаманить" по новой и про "танец с бубнами" не забудь. :D
Met vriendelijke groetjes
VS2008 Pro FW3.5 SP1

cosmo_vk
Новичок
Новичок
 
Сообщения: 33
Зарегистрирован: 26.12.2006 (Вт) 12:07
Откуда: Владимирская обл, г.Ковров

Сообщение cosmo_vk » 11.08.2007 (Сб) 9:43

В настройках SQL Server надо для пользователя поставить язык Russian вместо English.(Security -> Logins -> Properties и ищем Default Language)

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 11.08.2007 (Сб) 10:58

Ага. И в системе ещё покопаться, в настройках даты. Чтобы вообще все программы работать перестали, кроме программы автора, который http://bbs.vbstreets.ru/viewtopic.php?p=6670561#6670561 так и не прочитал. Или не понял.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

cooler
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 90
Зарегистрирован: 09.08.2004 (Пн) 4:58
Откуда: Che sity

Сообщение cooler » 11.08.2007 (Сб) 15:17

GSerg писал(а):http://bbs.vbstreets.ru/viewtopic.php?p=6670561#6670561 так и не прочитал. Или не понял.
GSerg, если вы об этом:
Не делать преобразований вообще, а использовать внутри программы саму дату, а не её строковое представление
то:
Нет, без преобразований неполучится, т.к. для записи в SQL бд дата берется из названия столбца в DataGridView.
да и Цитата:
если делать без преобразований, то он дату и месяц меняет местами
или я действительно чего-то не понял
Windows написанна с применением искусственного интеллекта. И как любое разумное существо старается работать как можно меньше :))

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 11.08.2007 (Сб) 15:29

Действительно, не понял разницу между датой и строковым представлением даты.
Разницу между 2 и "2" понимаешь?
Там такая же.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

cooler
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 90
Зарегистрирован: 09.08.2004 (Пн) 4:58
Откуда: Che sity

Сообщение cooler » 11.08.2007 (Сб) 18:39

Ну ясно дело понимаю, не первый год уже программирую, НО в моей программе нужно именно так: читает из БД, пишет дату в имя колонки, дальше при определенных событиях она берет из имени колонки дату(ы) и формирует запрос на запись в БД!!!! А создавать динамический масиив(т.к. колонок может быть каждый раз разное) и брать оттуа эти даты (типа mass(e.oloumnindex или как там его)) мне всеже не хочется!!!! И как по Вашему я должен это делать без стринговых преобразований????
Windows написанна с применением искусственного интеллекта. И как любое разумное существо старается работать как можно меньше :))

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 11.08.2007 (Сб) 19:04

А почему, собственно, не хочется? Потому что это самое простое и очевидное решение, и значит, не подходит? :roll:
Не хочешь массив, храни где угодно эту дату (в виде даты, а не в виде строки).

Если я заполню этот грид в программе данными, а потом схожу в параметры системы и поменяю формат представления даты на абсолютно левый, что, прога упадёт, попытавшись распарсить старую строку по новым правилам? И это, хм, хорошо?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

cosmo_vk
Новичок
Новичок
 
Сообщения: 33
Зарегистрирован: 26.12.2006 (Вт) 12:07
Откуда: Владимирская обл, г.Ковров

Сообщение cosmo_vk » 11.08.2007 (Сб) 21:27

GSerg писал(а):Ага. И в системе ещё покопаться, в настройках даты. Чтобы вообще все программы работать перестали, кроме программы автора, который http://bbs.vbstreets.ru/viewtopic.php?p=6670561#6670561 так и не прочитал. Или не понял.
Зачем в системе то? Просто выставляются настройки, соотвествующие стране. Больше этого и не надо.

cooler
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 90
Зарегистрирован: 09.08.2004 (Пн) 4:58
Откуда: Che sity

Сообщение cooler » 12.08.2007 (Вс) 8:44

2cosmo_vk: GSerg прав, этой БД не я один пользуюсь и дабы не обламывать других меняя эти настройки лучше их наверное не трогать
2GSerg: используя переменные типа даты он все равно ругается на выход за пределы допустимого диапазона. Новые даты добавляются через DateTimePicker1.Value. И когда к примеру выбираю 16.08.2007 и пытаюсь писать в БД вылетает эта ошибка
Windows написанна с применением искусственного интеллекта. И как любое разумное существо старается работать как можно меньше :))

Thomas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 246
Зарегистрирован: 12.11.2005 (Сб) 0:17
Откуда: "Сказочное королевство"

Сообщение Thomas » 12.08.2007 (Вс) 10:22

cooler
Привет
А как ты это
Новые даты добавляются через DateTimePicker1.Value. И когда к примеру выбираю 16.08.2007 и пытаюсь писать в БД вылетает эта ошибка
делаешь?
При помощи Sql-команды (с параметрами или без) или используешь хранимую процедуру на сервере?
Если sql-команда без параметров, тогда нужно однозначно "шаминить" с представлением даты, чтобы сервер её принял. Для этого я делаю следующее: создаю в редакторе View с использованием уловия по дате и смотрю как она прописывается в SQL-команде. А потом к этому виду привожу дату, которую надо добавить в таблицу SQL-сервера.
При использовании параметров по идее должно работать и так, передаешь серверу переменную типа DataTime, а он сам разбирается как её записать. (я так, думаю 8) )
Met vriendelijke groetjes
VS2008 Pro FW3.5 SP1

cooler
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 90
Зарегистрирован: 09.08.2004 (Пн) 4:58
Откуда: Che sity

Сообщение cooler » 12.08.2007 (Вс) 11:44

я делаю так:
Код: Выделить всё
CommandSQL.CommandText = "update journal set ... where  journal.date_time='" + Arr(i) + "'"
т.е. без использования хранимой процедуры. Или нужно написать полный запрос? Можно подробнее про использование параметров и метод приведения в нужный вид. Arr(i) это массив типа дата, куда перед этим записывается дата или из БД или из DatePicker'a
Windows написанна с применением искусственного интеллекта. И как любое разумное существо старается работать как можно меньше :))

След.

Вернуться в Visual Basic .NET

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

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

    TopList