Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2012.04.29;
Скачать: [xml.tar.bz2];

Вниз

Камень в огород (джава комьюнити)   Найти похожие ветки 

 
Медвежонок Пятачок ©   (2011-12-28 10:11) [0]

юзаю birt. /*вынужденно*/

отчет строится по данным оракла.
в оракле поле date (просто date, не таймстамп и без всяких таймзон)

в поле дата лежит дата.
скажите плиз, какого хрена эта поделка применяет к полю даты свои представления о моем часовом поясе?


 
Компромисс ©   (2011-12-28 10:30) [1]


> скажите плиз, какого хрена эта поделка применяет к полю
> даты свои представления о моем часовом поясе?


Типичная проблема. Она считает, что это дата с временем. Сам мучался в аналогичном случае вплоть до того, что клиент запрашивает timezone сервера и делает соответствующую поправку. Нет в java стандартного класса, который просто дата :(


 
Компромисс ©   (2011-12-28 10:31) [2]

Хотя с другой стороны, так правильнее. Вот в Москве уже 28 декабря, а в каком-нибудь Сан-Франциско еще 27 декабря.


 
Медвежонок Пятачок ©   (2011-12-28 10:40) [3]

Да тело то не в том, что дата со временем.
Она и в оракле со временем. Хотя обычно время там усечено до полуночи для данных типа "дата рождения" или "дата чего-то там"

Но это именно дата, а не таймстамп с таймзоной.

Например если я родился вечером 1 января в европейской части РФ, то в японии в это время было уже второе января.
Но если я вдруг поеду в японию, то это же не значит, что мне в паспорте надо поменять дату рождения на 2 января. Хотя для японцев-то я родился именно второго.
Или еще проще: я родился 1 января в РФ. В москве сделали инсерт в бд в поле дата. База видна в токио. И в токио мне печатают свидетельство о рождении. Если сделать селект этой даты в токио, то вернется 1 число.
А если результат этого селекта напечатать в этом поделиё, то оно, умное цуко, напечатает второе число.


 
Jeer ©   (2011-12-28 10:47) [4]

В Oracle вообще много шуток со сменой времени.
http://www.sql.ru/forum/actualthread.aspx?bid=3&tid=827151&pg=1


 
TUser ©   (2011-12-28 10:51) [5]

надо еще в юлианский пересчитывать, если дата до такого-то года (для каждой страны своего), будет весело


 
Компромисс ©   (2011-12-28 11:03) [6]

Медвежонок Пятачок ©   (28.12.11 10:40) [3]


> Она и в оракле со временем


Тогда какие претензии к java? :)
Если они сделают, как ты предлагаешь, то будет невозможно учитывать часовой пояс. То есть ввести коррекцию для получения того, что нам надо, мы сейчас можем, а вот при альтернативном подходе уже не сможем получить дату с учетом разницы часовых поясов.

ИМХО дата без времени не имеет смысла и существует лишь по историческим причинам.


 
Медвежонок Пятачок ©   (2011-12-28 11:24) [7]

Тогда какие претензии к java? :)
Если они сделают, как ты предлагаешь, то будет невозможно учитывать часовой пояс.


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

Если же тип данных - старый Date, то не надо его трогать вообще.
Бастилию взяли 14 июля. И эта дата должна пройти насквозь все явы-шнявы на лист бумаги без изменений.

ИМХО дата без времени не имеет смысла и существует лишь по историческим причинам.


да ипона же мать. время здесь не причем вообще. усеченное до полуночи время - это тоже время. Мне вовсе не нужен оракловый тип даты без времени. Мне надо чтобы данные типа date не обрабатывались ничьим интеллектом.


 
Компромисс ©   (2011-12-28 11:48) [8]

Медвежонок Пятачок ©   (28.12.11 11:24) [7]

В java.util.Date есть timezone.

Как я уже писал выше, в java нет класса для просто даты, бех времени и timezone.


 
sniknik ©   (2011-12-28 11:49) [9]

> Мне надо чтобы данные типа date не обрабатывались ничьим интеллектом.
а как оно понимает, насколько сдвиг, если в дате не хранится таймзон?
->
> просто date, не таймстамп и без всяких таймзон

ну т.е. 28.12.2011 записанное в москве это 27.12.2011 20:00 по гринвичу + 4 (так вроде?)
а в токио (допустим +12) это будет 28.12.2011 08:00 или вообще без учета 28.12.2011 12:00?
ну т.е. насколько интеллект там вообще "интеллектен"?
и если что, откуда берет не существующую инфу?


 
Медвежонок Пятачок ©   (2011-12-28 11:56) [10]

а как оно понимает, насколько сдвиг, если в дате не хранится таймзон?

обнаружили совершенно случайно, как раз по мотивам медведа и айфона.
после несостоявшегося перехода на зимнее.

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

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

причем если выполнить просто селекты (в девелопере или в плюсе) то там и там видим то, что и должны видеть - исходную дату заключения.
а в отчете - уже нет.


 
Компромисс ©   (2011-12-28 12:02) [11]

Медвежонок Пятачок ©   (28.12.11 11:56) [10]

ИМХО sniknik © намекал, что если оно знает, какую поправку делать, то в Date есть timezone и тогда по твоему же алгоритму
Если тип данных тоже с таймзоной (например таймстамп виз таймзоне) - тогда еще куда ни шло, хотя это же самое  преобразование сделает и клиентская либа оракла.

Кстати, если отчет формировать на сервере, то проблемы тоже могут быть. Мы, например, генерируем отчет MS Excel на сервере, а клиент возмущается, почему время показано не в его timezone.

java.sql.Timestamp extends java.util.Date


 
Медвежонок Пятачок ©   (2011-12-28 12:18) [12]

У древнего ораклового типа Date нету никакой таймзоны.
Это только в девятке появились новые типы с таймзоной.

Едем в Гривич, устанавливаем оракл, настраиваем таймзону.
создаем таблицу create table mytable(date_field date);
В девять часов утра, 29 декабря 2011 года, по местному гринвичскому времени, приходим в гринвичский офис и делаем:
insert into mytable values (sysdate);
селектим в плюсе и в гринвиче , то что вставили, видим: "29.12.2011 09:00:00"

Садимся на велосипед, едем в токио, на остров пасхи и в москву.
Настраиваем там клиента оракла и делаем тот же селект из этой таблицы.

И во всех трех местах плюс нам покажет "29.12.2011 09:00:00"

Возвращаемся в гринвич.

на следующий день создаем таблицу: create myanothertable(ts_field timestamp with local timezone)
insert into myanothertable values (sysdate);

повторяем селект в гринвиче, видим "30.12.2011 09:00:00"

едем обратно, куда ездили и повторяем селекты.
и во всех трех местах видим, когда я сделал инсерт но уже по местному (токийскому, московскому и острова пасхи) времени.

И то и другое понятно.
Непонятно зачем наворачивать свою логику вокруг простого как лопата типа Date


 
Компромисс ©   (2011-12-28 12:22) [13]

http://www.date4j.net/


 
Медвежонок Пятачок ©   (2011-12-28 12:27) [14]

ага.
заголовок статьи по ссылке слишком длинный.
второе и третье слова - лишние.


 
Компромисс ©   (2011-12-28 12:29) [15]

Кстати, из той же статьи следует, что серьезные проблемы есть и у Oracle:

Oracle
Oracle has 2 data types named TIMESTAMP WITH TIME ZONE and TIMESTAMP WITH LOCAL TIME ZONE.

TIMESTAMP WITH TIME ZONE stores an offset in the column. Again, an offset is not the same thing as a time zone.

TIMESTAMP WITH LOCAL TIME ZONE doesn"t store explicit offset information at all. Rather, it implicitly uses the database"s offset. Again, when returning this data to a client, a database-defined policy is applied (using a difference in offsets), a calculation is performed, and the altered value is returned.

The difference in offsets is usually (but not always) calculated using DBTIMEZONE (the database default) and SESSIONTIMEZONE (the session setting). Again, such policies may or may not be relevant or appropriate for an application.

Oracle does mention the idea of time zones as opposed to offsets (as in "America/Montreal"), but these items are apparently not stored anywhere in a database column.


 
Компромисс ©   (2011-12-28 12:33) [16]

Кстати, проблема не совсем в java.

First of all, take the ANSI SQL standard. Its very definition of time zone doesn"t match the definition of TimeZone in Java. Why? Because ANSI SQL defines time zones as a fixed offset from Universal Time. But an offset is not a time zone. Since they don"t take into account summer hours, they don"t match what most people think of as a proper time zone. Such a glaring mismatch of fundamental abstractions is bound to be a fruitful source of error, annoyance, and widespread confusion.

с того же сайта


 
Медвежонок Пятачок ©   (2011-12-28 12:50) [17]

Кстати, проблема не совсем в java.
Так я и камень кидал не совсем в яву. А во все ее сообщество.
Про которое мне много лет говорят сказочные вещи:
Да ты чо! это же ява! Там жеж сотни тысяч разрабов по всему миру наработали терабайты замечательных классов. Все они супер пушистые и клевые, ибо опенсорс и миллионы ява-хомячков следят за косяками (а потому их там и быть-то не должно)

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


 
sniknik ©   (2011-12-28 12:55) [18]

> ИМХО sniknik © намекал, что если оно знает, какую поправку делать, то в Date есть timezone
предлагал проверить... смотря на то как делает разницу.

> Кстати, проблема не совсем в java.
цитата как раз описывает правильное поведение для "датывремени" без тайм зон. - что положили, неважно откуда (из какой зоны), то и прочитали, неважно где (в какой зоне).
то что у кого-то это вызовет раздражение... ну и хрен с ними.
а вот почему это будет источником ошибки не понял... ну вот записал я число 10, почему я должен ожидать число 12 при чтении только потому что сам сместился например в другую комнату?


 
Компромисс ©   (2011-12-28 13:07) [19]

Медвежонок Пятачок ©   (28.12.11 12:50) [17]


> А во все ее сообщество.
> ...
> Да ты чо! это же ява!


Странно. Если кто-то глупость сказал, его и ругай. Причем тут "все ее сообщество"???
Мне, например, java нравится больше Delphi (хотя Delphi - первая любовь, так сказать:), но при этом я вижу в яве множество недостатков.

sniknik ©   (28.12.11 12:55) [18]


> а вот почему это будет источником ошибки не понял... ну
> вот записал я число 10, почему я должен ожидать число 12
> при чтении только потому что сам сместился например в другую
> комнату?


Потому что в java.util.Date есть timezone.


 
Медвежонок Пятачок ©   (2011-12-28 13:14) [20]

Потому что в java.util.Date есть timezone.

На русский это переводится как:
изобретатели явы не подумали над тем, что иногда дата - это просто дата без таймзоны


 
Компромисс ©   (2011-12-28 13:15) [21]

Кстати, насчет дат.

Судя по http://stackoverflow.com/questions/2305973/java-util-date-vs-java-sql-date, вполне возможно, что при использовании java.sql.Date вместо java.util.Date автоматического преобразования не будет.


 
Компромисс ©   (2011-12-28 13:16) [22]

Медвежонок Пятачок ©   (28.12.11 13:14) [20]

Не совсем так, баг немного в другом.

java.sql.Date is intended to represent a date without a time, but that is not actually enforced.

http://www.date4j.net/


 
Компромисс ©   (2011-12-28 13:17) [23]

Basically databases usually support at least three forms of datetime fields which are date, time and timestamp. Each of these have a corresponding class in JDBC and each of them extend java.util.Date. Quick semantics of each of these three are the following:
java.sql.Date corresponds to SQL DATE which means it stores years, months and days while hour, minute, second and millisecond are ignored. Additionally sql.Date isn"t tied to timezones.java.sql.Time corresponds to SQL TIME and as should be obvious, only contains information about hour, minutes, seconds and milliseconds.
java.sql.Timestamp corresponds to SQL TIMESTAMP which is exact date to the nanosecond (note that util.Date only supports milliseconds!) with customizable precision.

One of the commonest bugs in JDBC drivers in relation to these three types is that the types are handled incorrectly. This means that sql.Date is timezone specific, sql.Time contains current year, month and day et cetera et cetera.

http://stackoverflow.com/questions/2305973/java-util-date-vs-java-sql-date


 
Медвежонок Пятачок ©   (2011-12-28 13:25) [24]

все это заумные отмазки явистов.

дада, мы конечно знаем, что есть базы данных и в них есть по крайней мере больше одного способа хранения даты/времени, что бывает и не так как мы предполагали, но на это мы клали ибо мы ява.


 
Компромисс ©   (2011-12-28 13:25) [25]


> изобретатели явы не подумали над тем, что иногда дата -
> это просто дата без таймзоны


Изобретатели явы явно написали в http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Date.html:

The class Date represents a specific instant in time, with millisecond precision.

То есть часы-минуты-секунды имеют значение, то есть не игнорируются. А если они не игнорируются, то обязана быть и timezone.


 
Компромисс ©   (2011-12-28 13:30) [26]

Медвежонок Пятачок ©   (28.12.11 13:25) [24]

Еще раз:

The class Date represents a specific instant in time, with millisecond precision.

Класс Date представляет определенное мгновение во времени, с точностью до миллисекунды.

http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Date.html

А еще давайте ругать яву, что, когда я в String храню целочисленные значения, у меня неправильно сортировка работает и "9" оказывается позже "11" :)


 
Компромисс ©   (2011-12-28 13:32) [27]

Do you absolutely have to use java.util.Date? I would thoroughly recommend that you use Joda Time instead. In particular, while Date and Calendar always represent a particular instant in time, with no such concept as "just a date", Joda Time does have a type representing this (LocalDate). Your code will be much clearer if you"re able to use types which represent what you"re actually trying to do.

http://stackoverflow.com/questions/5050170/java-getting-date-without-time


 
Медвежонок Пятачок ©   (2011-12-28 13:36) [28]

А если они не игнорируются, то обязана быть и timezone.

Не обязана.
Был выше пример с датой рождения.
Дату и время рождения должно быть можно вставить в поле даты.
А когда печатают свидетельство о рождении, должна быть напечатана дата рождения, которая не должна перескакивать на соседние даты в зависимости от того, где печатают документ.

Ява на это клала. Не клала бы, не было бы проблемы.


 
Медвежонок Пятачок ©   (2011-12-28 13:38) [29]

вопрос нужности таймзоны - это вопрос прикладной предметной области, а не абсолют.

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

а есть куча случаев, когда нужна дата/время как абсолютное значение.
"22 июня ровно в четыре утра"
и таймзона здесь нахрен не нужна.


 
Компромисс ©   (2011-12-28 13:46) [30]

Медвежонок Пятачок ©   (28.12.11 13:36) [28]

Извини, ты наверное по-английски не понимаешь. Стандартный класс java.util.Date не подходит для хранения даты рождения (как в паспорте). Он для этого не предназначен и соответственно при его использовании в данном случае могут начаться различные проблемы.

Нет легкого способа использовать нужную тебе "просто дату" в стандатной яве. Рекомендуемое решение - использовать нестандартный класс, например, из библиотеки Joda Time.

It does not make sense to talk about a date without a timestamp with regards to the Date routines in the standard java runtime, as it essentially maps down to a specific millisecond and not a date. Said millisecond intrinsically has a time of day attached to it.

If you want to work with dates instead of milliseconds, you need to use another library. The JODA library is well suited for dealing with this.


 
Медвежонок Пятачок ©   (2011-12-28 13:48) [31]

Извини, ты наверное по-английски не понимаешь.

Я понимаю.

Это ты по-русски не понимаешь.

Внезапно есть тип данных для хранения даты/времени для которого не нужна таймзона.


 
Компромисс ©   (2011-12-28 13:48) [32]

Медвежонок Пятачок ©   (28.12.11 13:38) [29]

Joda-Time includes these key datetime classes:

DateTime - Immutable replacement for JDK Calendar
DateMidnight - Immutable class representing a date where the time is forced to midnight
LocalDate - Immutable class representing a local date without a time (no time zone)
LocalTime - Immutable class representing a time without a date (no time zone)
LocalDateTime - Immutable class representing a local date and time (no time zone)

http://joda-time.sourceforge.net/quickstart.html

Перевод google.com:

Joda времени включает в себя ткани классов даты ключ:

DateTime - непреложных замену JDK календарь
DateMidnight - непреложных класс, представляющий время данных, в которой вынужден Полночь
LocalDate - непреложных класса местной Представление данных без времени (часовой пояс)
Местное время - Представление времени непреложных класса без даты (без часового пояса)
LocalDateTime - непреложных класс, представляющий местное время и дату (без часового пояса)


 
Медвежонок Пятачок ©   (2011-12-28 13:50) [33]

Знаешь, на кого ты сейчас похож?
Тока не обижайся, я не со зла.

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

Мне же нужно получить дату как абсолютное значение без искажений.


 
Компромисс ©   (2011-12-28 13:51) [34]

Медвежонок Пятачок ©   (28.12.11 13:48) [31]


> Это ты по-русски не понимаешь.
>
> Внезапно есть тип данных для хранения даты/времени для которого
> не нужна таймзона.


Всё я понимаю. Нет в стандартного яве такого класса, который тебе нужен.
java.util.Date  хранит только полное время, для которого нужна таймзона.
А тебе нужен без времени и без таймзоны.
Такой есть в JODA Time, см. предыдущий мой пост


 
Медвежонок Пятачок ©   (2011-12-28 13:52) [35]

Нет в стандартного яве такого класса,

И это косяк явы.


 
Медвежонок Пятачок ©   (2011-12-28 13:54) [36]

А тебе нужен без времени и без таймзоны.

Мне нужно просто без таймзоны. Со временем.


 
Компромисс ©   (2011-12-28 13:55) [37]

Медвежонок Пятачок ©   (28.12.11 13:50) [33]

Я понимаю. Я сегодня новое о Java узнал. К счастью, это не затрагивает мои проекты, потому как там либо использовалась дата с временем, либо в качестве клиента выступает Flex через BlazeDS, который всё равно не мог бы корректно работать с JODA.

Я понимаю, что ты до сих пор отказываешься понимать, как же так - вместо java.util.Date для представления даты надо использовать какой-то "левый" класс, но тем не менее, это так. "Я сам в шоке" (с) анекдот


 
Компромисс ©   (2011-12-28 13:55) [38]


> И это косяк явы.


Согласен.


 
Компромисс ©   (2011-12-28 13:57) [39]


> Мне нужно просто без таймзоны. Со временем.


LocalDateTime - Immutable class representing a local date and time (no time zone)



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2012.04.29;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.57 MB
Время: 0.003 c
15-1324931403
Юрий
2011-12-27 00:30
2012.04.29
С днем рождения ! 27 декабря 2011 вторник


15-1324455263
OW
2011-12-21 12:14
2012.04.29
Посоветуйте. Нужна утилитка COM <-> TCP


15-1324586003
Германн
2011-12-23 00:33
2012.04.29
Как очистить пространство имен СОМ-портов?


15-1324540812
Фокс Йожин
2011-12-22 12:00
2012.04.29
Глюки IE9 с фреймами


2-1325671887
jacksotnik
2012-01-04 14:11
2012.04.29
Вопрос по отладчику





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский