metaclass: (Default)
[personal profile] metaclass
в Java c датой и временем.
Конкретно, чтобы на Clojure засунуть в jdbc параметр дату, пришлось перерыть весь гугл, исходники jaybird (firebird jdbc драйвера), внутренности joda-time и ее кложурной обертки clj-time

http://www.paullegato.com/blog/clojure-joda-sql-date-time/

(defn to-sql-date [date]
"Convert any Joda-readable date object (including a string) to a java.sql.Date"
(java.sql.Date. (.. (LocalDate. date) toDateMidnight toInstant getMillis)))

Основной затык - только в org.joda.time.LocalDate нормально сделана дата, без времени и временных зон. А jdbc драйвер понимает только java.sql.Date и вроде еще пару вариаций на тему "эпоха в long"

Date: 2012-02-15 10:04 pm (UTC)
From: [identity profile] dair-spb.livejournal.com
а зачем нужна дата кроме как "эпоха в long"? Академический интерес.

Date: 2012-02-15 10:21 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Бухгалтерия. Там даты проводок это просто даты, без времени и таймзон.

Date: 2012-02-15 11:35 pm (UTC)
From: [identity profile] antontsau.livejournal.com
а вот кстате тема, как в оперднях воюют с таймзонами. Если филиал в таймзоне +8 часов (в моей реальности такого не было, но планы на Владивосток строились) работающий с 7 утра, один общий опердень на всю страну (вот это было, у нас не то что сервера но даже физически бухгалтерии на всех точках и филиалах поизвели и всех теток собрали в один огромный хлев на центральной площадке, в москве при бигбоссе), и ВНЕЗАПНО что-нибудь там меняют, то есть платежки с надцатого мартобря должны обрабатываться по другому. Это ж будет адъ бардака - платежка от сейчас таки должна быть от завтра, патамучта там уже завтра а здесь еще сегодня, но в (внешнем) банчке она обработается еще сегодня и тп и тд.

Date: 2012-02-16 12:04 am (UTC)
From: [identity profile] berezovsky.livejournal.com
капитан как бы намекает, что вечером операционист уходит домой, а утром приходит и разгребает новые платёжки

Date: 2012-02-16 12:21 am (UTC)
From: [identity profile] theiced.livejournal.com
ты не понимаешь - у них концепция что "сегодня" где то там может быть уже "завтра" в голову не вмещается.

Date: 2012-02-16 12:27 am (UTC)
From: [identity profile] antontsau.livejournal.com
никак нельзя-с, ЖАБА не поймет. Если платежка от вчера, то она и разобрана должна быть сегодня а не завтра, и тут же впихнута дальше. Время не просто деньги а баблищщщще, отложить на сутки платежи - у бигбосса инфаркт случится. Если в филиал пришел клиент и принес мешок бабла, то этот мешок бабла немедленно, прямщас, уже должен ехать куда ему положено (в безнальном виде, разумеется) а не вылеживаться. У нас и четвертый рейс использовали, и казначейство (отдел бухов непосредственно платежками занимающийся, не бекофис с бумажками) сидело, если надо, до победного конца. В конторе оборот в год пара миллиардов долларов, а в казначействе платежку на троягг - ходишь кругами и выясняешь, пойдет она сегодня или нет, опять все подчистили до полного ноля на какие-то критические платежи.

Date: 2012-02-16 01:29 am (UTC)
From: [identity profile] norguhtar.livejournal.com
Треш и угар с Date и Timestamp там давно :)

Date: 2012-02-16 08:37 am (UTC)
From: [identity profile] sergiej.livejournal.com
"Основной затык - только в org.joda.time.LocalDate нормально сделана дата, без времени и временных зон."
ИМХО Если дата нужна "без времени и временных зон" - хранить её достаточно в стринге, и не заниматься никакой оккультной фигнёй.

Date: 2012-02-16 04:50 pm (UTC)
From: [identity profile] metaclass.livejournal.com
А расчеты на датах как вести? +1 день, -1 месяц и прочая.

Date: 2012-02-16 05:00 pm (UTC)
From: [identity profile] sergiej.livejournal.com
установить календарь в правильной зоне, парсить туда этот стринг, посчитать и обратно в стринг.
Ну и библиотеки всякие есть, та же йода.
Ужасная задача в "чистой" джаве - посчитать сколько сегодня лет пациенту, зная "дату" его рождения :) Недавно наблюдал как два индуса и индуска засыпались, но справились, всего строк 300 кода :))
А так хочется чтобы был метод "getAgeByBirthDate"

Date: 2012-02-16 05:01 pm (UTC)
From: [identity profile] metaclass.livejournal.com
йода очень гуманен.

Date: 2012-02-16 05:14 pm (UTC)
From: [identity profile] sergiej.livejournal.com
Йода супер.
Недавно работали с системой, в которой в очередной версии "проапгрейдили" внутренний тип данных Date (который был "тупой" набор трёх полей год-месяц-день с опциональной зоной) в "совместимый" с джавовским - который держит на самом деле время. Столько матерщизны собрали, если только время на клиенте не совпадает с временем на сервере - все клиенты рождаются вчера или завтра, все контракты подписаны "вчерашним днём", условленные даты в рамках контрактов попролетали на один день. Да что там другая зона, достаточно перейти на летнее/зимнее время и день перескакивает.
Не знаю как в оперденях, но обычный бизнес это разносит вдребезги.
Ад усугубляется тем, что куча всяких батчей тянет/пихает данные в другие системы как раз в районе полуночи, и разнос по датам - гарантирован. Особенно когда данные передаются XML, которые другая сторона парсит ещё добавляя и своё понимание к проблематике даты.

Date: 2012-02-22 09:05 pm (UTC)
From: [identity profile] http://users.livejournal.com/_windwalker_/
что может быть проще времени... (ц) не мой.

Date: 2012-02-22 09:30 pm (UTC)
From: [identity profile] sergiej.livejournal.com
Да, я тоже всегда отвечаю фразой из Саймака. А потом вздыхаю, опрокидываю мысленно сто грамм и начинаю долго индусам объяснять что такое время :) Казалось бы что пациенты, которые живут в часовом поясе на полчаса отличающимся от соседей всё должно быть понятно лучше других... но почемуто всегда непонятно.
Говорят (индусы) у них в языках нет прошлого и будущего, вернее оно одним словом както говорится. Вобчем что вчера что завтра - всё одна маньяна

Date: 2012-02-22 09:44 pm (UTC)
From: [identity profile] http://users.livejournal.com/_windwalker_/
ой-вей, индусы это наше всё.

Date: 2012-02-22 09:50 pm (UTC)
From: [identity profile] sergiej.livejournal.com
Как говорит один мой коллега: они такие неловкие, ка детки.

Date: 2012-02-16 09:49 am (UTC)
From: [identity profile] volodymir-k.livejournal.com
Проблема проистекает не от явы, а из-за отсутствия SQL стандарта на типы временнЫх данных, а также совершенно различных концепций в разных RDBMS.
Соответственно в одних серверах хранится BCD-like просто дата, в других epoch локального (=серверного времени), в третьих можно с таймзоной, можно без, причём таймзона может быть а)серверная, б) аппсерверная в) браузерная г) из профиля пользователя. В odbc они говорят просто -- вот структура, сношайтесь как хотите. В jdbc есть некий аналог по умолчанию, но обычно вендоры дают и свои реализации.

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

Date: 2012-02-16 05:06 pm (UTC)
From: [identity profile] slonopotamus.livejournal.com
Всë в sql есть, timestamp with timezone.

Date: 2012-02-16 05:56 pm (UTC)
From: [identity profile] sergiej.livejournal.com
Нихрена там нет таймзоны, Дата это универсальное время, оно не содержит информации о временном поясе, совсем. Проблема в том что Дата всегда создаётся как "локальная", и если её надо использовать "глобально" надо заниматься извращением - тянуть в дополнение к Дате ещё и временную зону в которой эту дату создавали.
Проблема даже глобальнее, она в том что для людей есть такое понятие как "дата" а для Джавы - нет. Тупо есть только время. То есть если контракт заключён в Минске с датой 1.1.2012 (на контракте так написано) и клиентское приложение в соответствии со всеми законами и правилами создало java.util.Date как полночь локального времени, итак для нормального человека это просто 1.1.2012, а для системы
это 31.12.2011 GMT + 3, и тут начинается ад, для клиентского приложения в Лондоне это 31.12.2011, для клиентского приложения в Москве это 1.1.2012. Что есть бред, даже если контракт заключён ночью у него одна "дата" - 1.1.2012.
Волевое решение писать все "даты" в одном временном поясе - например сервера помогает частично, танцы с переводам этой даты в человеческую дату клиента всё равно никто не отменял.
Edited Date: 2012-02-16 05:57 pm (UTC)

Date: 2012-02-16 06:21 pm (UTC)
From: [identity profile] slonopotamus.livejournal.com
Я хер знает какой там у вас sql (видимо тоже fb, в котором, как выяснилось, даже лога запросов нет), в моëм sql всë есть: http://www.postgresql.org/docs/9.1/static/datatype-datetime.html#DATATYPE-DATETIME-TABLE
И с таймзоной и без таймзоны и отдельно дата без времени и отдельно время без даты.

Date: 2012-02-16 06:24 pm (UTC)
From: [identity profile] sergiej.livejournal.com
Где вы там увидели таймзон у "даты"???

Date: 2012-02-16 06:33 pm (UTC)
From: [identity profile] slonopotamus.livejournal.com
Само название ТАЙМзоны совершенно недвусмысленно намекает что она имеет отношение ко ВРЕМЕНИ. Если у нас нет ВРЕМЕНИ, то и нет смысла говорить о таймзоне.

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

Ваш пример надуман.

Date: 2012-02-16 06:38 pm (UTC)
From: [identity profile] sergiej.livejournal.com
Таймзона не имела бы отношения к дате, если бы лядский Date не был ВРЕМЕНЕМ - полночью ЛОКАЛЬНОГО времени. Каким боком я могу узнать в базе, в каком лядском локальном времени был тот, кто коздавал Дату если я этого специально где-то не запишу?

Date: 2012-02-16 06:49 pm (UTC)
From: [identity profile] slonopotamus.livejournal.com
Когда в лядском sql хранится лядская дата без времени, утверждается, что у неë нет понятия таймзоны. Вааще нет. И не нужно думать о таймзоне когда делается распечатка контракта. Надо просто печатать "2012-01-01".

Date: 2012-02-16 07:19 pm (UTC)
From: [identity profile] sergiej.livejournal.com
Вы что, издеваетесь? В этом и проблема что сколько бы правильно база дату не записывала, в жабе Дата это будет полночь ЛОКАЛЬНОГО времени. То есть получая вашу дату из базы жабовскому приложению нужно гадать для какого же пояса дату создавать.

Date: 2012-02-16 07:26 pm (UTC)
From: [identity profile] slonopotamus.livejournal.com
Это кривизна жабской Даты, а вовсе не sql'я.

Date: 2012-02-16 07:54 pm (UTC)
From: [identity profile] sergiej.livejournal.com
У жабы проблема это факт, но у жабы и отмазка простая - в отсутствиии единого стандарта получается кривой java.sql.Date, который не знает что "с той стороны" за дата имеется в виду.
Кроме того со стороны джавы проблема легко решается расширением типа даты.

Date: 2012-02-16 06:42 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Ну, про это речь и идет. О том, что нужен тип "дата" :)

Date: 2012-02-16 06:50 pm (UTC)
From: [identity profile] slonopotamus.livejournal.com
Да есть в базе тип "дата". И называется он, как это ни странно, date.

Date: 2012-02-16 07:01 pm (UTC)
From: [identity profile] metaclass.livejournal.com
А в жабе java.util.Date - внезапно, содержит время, равное полночи, и таймзону.

Date: 2012-02-16 07:04 pm (UTC)
From: [identity profile] slonopotamus.livejournal.com
java.util.Date (как и java.util.Calendar) - феерический пиздец, который починен только в joda-time. Однако посыл тред-стартера (не путать с топик-стартером) был в том, что в sql нет типа "дата".

Date: 2012-02-16 07:22 pm (UTC)
From: [identity profile] sergiej.livejournal.com
Посыл в том что нет стандарта, позволяющая эту дату переделывать однозначно в жавовскую дату, и нужно тягать ещё дополнительную информацию, или забить, и читать её в стринг.

Date: 2012-02-17 05:28 am (UTC)
From: [identity profile] antontsau.livejournal.com
нинада. В контрактах очень часто пишут. В страховках так вообще обязательно - "вступает в действие с 00.00 надцатого мартобря", а привязка по месту заключения контракта (что тоже обязательный аттрибут!) или прямо указывается временная зона (AEDT какой-нибудь). Ибо оно реально работает, расколотил застрахованный мошын на 15 минут раньше или позже границы - все, контракт не катит.

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 28th, 2025 03:39 pm
Powered by Dreamwidth Studios