timezone
От: Аноним  
Дата: 09.10.12 09:49
Оценка:
http://bugs.mysql.com/bug.php?id=22695

Как воспроизвести такой баг в ява проге и протестить его через junit
Есть идеи?
Re: timezone
От: . Великобритания  
Дата: 09.10.12 22:07
Оценка:
Здравствуйте, Аноним, Вы писали:

> http://bugs.mysql.com/bug.php?id=22695


> Как воспроизвести такой баг в ява проге и протестить его через junit

> Есть идеи?
Я не совсем понял что значит из java. Если именно парсинг данных, то вот примерно так:
        final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        simpleDateFormat.setTimeZone(TimeZone.getTimeZone("Canada/Eastern"));
        simpleDateFormat.setLenient(false);
        final Date date = simpleDateFormat.parse("2012-03-11 02:49:54");

Оно кидает исключение ParseException: Unparseable date
Как обернуть это в JUnit думаю сам догадаешься.

Я использовал другую дату, мне точно известную, потому что не понял какая там в баге таймзона используется.

Если тебе нужно протестить именно mysql, то это уже integration test, какой-нибудь сервер mysql поднимать и слать запросы через jdbc.
avalon 1.0rc3 rev 0, zlib 1.2.3.4
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re: timezone
От: Centaur Россия  
Дата: 10.10.12 05:02
Оценка:
Здравствуйте, Аноним, Вы писали:

А>http://bugs.mysql.com/bug.php?id=22695


А>Как воспроизвести такой баг в ява проге и протестить его через junit

А>Есть идеи?

Главная идея состоит в том, что хранить в базе локальное время без указания часового пояса — это уже баг.
Re[2]: timezone
От: Аноним  
Дата: 10.10.12 07:16
Оценка:
Здравствуйте, ., Вы писали:

.>Здравствуйте, Аноним, Вы писали:


>> http://bugs.mysql.com/bug.php?id=22695


>> Как воспроизвести такой баг в ява проге и протестить его через junit

>> Есть идеи?
.>Я не совсем понял что значит из java. Если именно парсинг данных, то вот примерно так:
.>
.>        final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
.>        simpleDateFormat.setTimeZone(TimeZone.getTimeZone("Canada/Eastern"));
.>        simpleDateFormat.setLenient(false);
.>        final Date date = simpleDateFormat.parse("2012-03-11 02:49:54");
.>

.>Оно кидает исключение ParseException: Unparseable date
.>Как обернуть это в JUnit думаю сам догадаешься.

.>Я использовал другую дату, мне точно известную, потому что не понял какая там в баге таймзона используется.


.>Если тебе нужно протестить именно mysql, то это уже integration test, какой-нибудь сервер mysql поднимать и слать запросы через jdbc.


Мне и самому не все тут ясно.
Примерно так. При попытке вставить дату или может быть timestamp в некоторых случаях mySql валится в исключение.
Я поразеваю, что всем виной неверная дата или неверная дата для mySql в какой-то временной зоне.
Типа у меня все работает, а кое-где кое у кого возникает редкий глюк.

Сначала хочу воспроизвести глюк тестом.
из доков на mySql
//A timestamp. The range is '1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07'
//UTC. TIMESTAMP values are stored as the number of seconds since the epoch ('1970-01-01 00:00:00' UTC).
//A TIMESTAMP cannot represent the value '1970-01-01 00:00:00' because that is equivalent to 0 seconds from
//the epoch and the value 0 is reserved for representing '0000-00-00 00:00:00', the “zero” TIMESTAMP value.

Date date = new java.util.Date(1251136551293L); по-моему в некоторых временных зонах дата уйдет в 1969 год и вставка в MySql
должна выпадсть в экспешн. Наверно есть и други невкусные даты. Может быть в разных субд могут быть другие невалидные даты.
Нужен список таких дат. Составлять вручную?

Хочу каким-то тестом отловить все методы где есть вставка дат в базу данных и подсунуть им некорекные даты.
Может быть и нужно поднимать MySql и т.д. но хотелось бы обойтись без этого.
Пока ищу идеи, как это правильно делать.

Может бы есть способ как то проверять дату перед вставкой на валидность?

Вот такие пироги.
Re[3]: timezone
От: . Великобритания  
Дата: 10.10.12 20:19
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Мне и самому не все тут ясно.

А>Примерно так. При попытке вставить дату или может быть timestamp в некоторых случаях mySql валится в исключение.
А>Я поразеваю, что всем виной неверная дата или неверная дата для mySql в какой-то временной зоне.
А>Типа у меня все работает, а кое-где кое у кого возникает редкий глюк.

А>Сначала хочу воспроизвести глюк тестом.

А>из доков на mySql
А>//A timestamp. The range is '1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07'
А>//UTC. TIMESTAMP values are stored as the number of seconds since the epoch ('1970-01-01 00:00:00' UTC).
А>//A TIMESTAMP cannot represent the value '1970-01-01 00:00:00' because that is equivalent to 0 seconds from
А>//the epoch and the value 0 is reserved for representing '0000-00-00 00:00:00', the “zero” TIMESTAMP value.

А>Date date = new java.util.Date(1251136551293L); по-моему в некоторых временных зонах дата уйдет в 1969 год и вставка в MySql

Ну это похоже больше на микросекунды, а не миллисекунды. Проверь тут — http://www.onlineconversion.com/unix_time.htm — выводит 41616 год. Ясен пень в 2038 не влазит.

А>должна выпадсть в экспешн. Наверно есть и други невкусные даты. Может быть в разных субд могут быть другие невалидные даты.

А>Нужен список таких дат. Составлять вручную?
Если у тебя даны миллисекунды с начала эпохи, то дата по определению валидная.

А>Хочу каким-то тестом отловить все методы где есть вставка дат в базу данных и подсунуть им некорекные даты.

А>Может быть и нужно поднимать MySql и т.д. но хотелось бы обойтись без этого.
А>Пока ищу идеи, как это правильно делать.
Надо начать с того, чтобы в точности понять что такое unix time, что такое таймзона и что такое валидная дата и что у тебя там творится в системе — где какой формат и что он значит.

А>Может бы есть способ как то проверять дату перед вставкой на валидность?

Зависит от.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[4]: timezone
От: Centaur Россия  
Дата: 11.10.12 07:06
Оценка: +1
Здравствуйте, ., Вы писали:

А>>Date date = new java.util.Date(1251136551293L); по-моему в некоторых временных зонах дата уйдет в 1969 год и вставка в MySql

.>Ну это похоже больше на микросекунды, а не миллисекунды. Проверь тут — http://www.onlineconversion.com/unix_time.htm — выводит 41616 год. Ясен пень в 2038 не влазит.

Нет, это миллисекунды. Классический unixtime — секунды от начала эпохи — это (в окрестностях нашего времени) десятизначное число (из которых первые пять — скорее дата, вторые — скорее время). Дата в примере — 1251.1 365:51.293 — это 2009-08-24T17:55:51.293Z.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.