LINUX.ORG.RU

Жабаприколы

 ,


1

2
Calendar cal = GregorianCalendar.getInstance();
Date dt; //from somewhere
...
log(dt.getClass().getName()+" / "+cal.getTime().getClass().getName());
log(dt.getTime()+" / "+cal.getTime().getTime());
log("Equals:"+dt.equals(cal.getTime()));
java.sql.Timestamp / java.util.Date
1525107600000 / 1525107600000
Equals:false

Понаделали дат, где как хочу, так и equals. Тупо царское сравнивание по long рулит.

Пиши на перле, зачем тебе это кровавый ынтерпрайз

annulen ★★★★★
()

Макаки это те, кто пишет equals не прочитав документацию по самым основам. Ну или те, кто в 2018 году используют java.util.Date.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

Макаки это те, кто пишет equals не прочитав документацию по самым основам.

А еще у них toString() кое-где выдаёт результат в зависимости от локали. Я сразу сравнивал 2 лонга, ибо вертел я их велосипеды. Просто попробовал сделать типа правильно и был удивлён.

Ну или те, кто в 2018 году используют java.util.Date.

Почему-то только все в 2к18 реализуют этот java.util.Date и пишут вокруг него кучу велосипедов разного калибра.

crutch_master ★★★★★
() автор топика
Ответ на: комментарий от bvn13

и да, ты не знаешь, как реализован метод equals по стандарту его реализации

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

crutch_master ★★★★★
() автор топика
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от bvn13

https://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html#equals...

Да, я в курсе, что они понапридумывали всякого говна и у них штук 10 обёрток для long разной степени упоротости и толщины. Одного походу уволняют другой приходит на его место и пишет новую реализацию Date.

crutch_master ★★★★★
() автор топика
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от crutch_master

А еще у них toString() кое-где выдаёт результат в зависимости от локали.

Где?

Я сразу сравнивал 2 лонга, ибо вертел я их велосипеды.

И правильно делал.

Просто попробовал сделать типа правильно и был удивлён.

equals применяется только для сравнения одинаковых объектов с одинаковыми данными. Даже числа сравнивать им нельзя бездумно: new BigDecimal("1.1").equals(new BigDecimal("1.10")) == false.

Почему-то только все в 2к18 реализуют этот java.util.Date и пишут вокруг него кучу велосипедов разного калибра.

В 2к18 надо использовать java.time.* или в крайнем случае Joda Time, если приходится сидеть на <1.8.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

Где?

Или в Double или при преобразовании float ставилась запятая как разделитель, если системная локаль русская. Отрыто в какой-то библиотеке для foxpro

equals применяется только для сравнения одинаковых объектов с одинаковыми данными.

Ну как. Они одинаковые на первый взгляд. Я не могу знать, кто их внутри своих либ как кастует. С BigDecimal - это всё понятно, тут ты сам их сравниваешь, делаешь new и всё такое, знаешь откуда они появились.

В 2к18 надо использовать

Меня это слегка унгетает. Чувствую я в 2к20 они опять уволят ту макау, которая это писала, наймут новую и опять всё перепишут.

crutch_master ★★★★★
() автор топика
Ответ на: комментарий от ma1uta

Да ты что? А что это?? В субд - это long, в жабке это long, даже в js - это long. Время ничем больше не может быть кроме как long, ну или long long, если кто-то до этого времени доживёт.

crutch_master ★★★★★
() автор топика
Ответ на: комментарий от crutch_master

Или в Double или при преобразовании float ставилась запятая как разделитель, если системная локаль русская. Отрыто в какой-то библиотеке для foxpro

Нет такого в toString(). Там всегда точка.

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

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

    public boolean equals(Object obj) {
        return obj instanceof Date && getTime() == ((Date) obj).getTime();
    }

С BigDecimal - это всё понятно, тут ты сам их сравниваешь, делаешь new и всё такое, знаешь откуда они появились.

Не уверен, что тебе тут всё понятно. Суть в том, что в BigDecimal размерность (число цифр после запятой) считаются частью значения при сравнении, поэтому 1.1 == 1.1, но 1.1 != 1.10. Если хочешь сравнивать, как числа, надо использовать compareTo.

Меня это слегка унгетает. Чувствую я в 2к20 они опять уволят ту макау, которая это писала, наймут новую и опять всё перепишут.

Маловероятно. Класс java.util.Date из 1994 года и сделан откровенно плохо. К java.time претензий нет.

Legioner ★★★★★
()
Последнее исправление: Legioner (всего исправлений: 1)
Ответ на: комментарий от crutch_master

Внезапно, время - это время. И чему же у тебя будет равен твой long для 1 месяца?

p.s.: java.util.Date - это эпичный косяк, с которым страдают из-за обратной совместимости. В частности косяк из-за того, что это long.

ma1uta ★★★
()

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

WitcherGeralt ★★
()
Ответ на: комментарий от Legioner

Нет такого в toString(). Там всегда точка.

Не знаю. Подаешь ему на вход Double - запятая. double/float - точка. Рыли сорцы дорыли до toString. Сменили локаль - теория подтвердилась.

Я бы не твоём месте разобрался потщательней, почему у тебя equals не срабатывает

Там не instance of Data точно, т.к. getClass().getName выдает

java.sql.Timestamp / java.util.Date

Соответственно. Понятно, что там что-то, что расширяет date, override'т какие-то свои методы, но какая мне должна быть разница? Да и сырое long у них идентичное, вот в чём дело-то.

Если хочешь сравнивать, как числа, надо использовать compareTo.

Всегда думал, что equals - это значит эквивалентные. Я уже, блин, боюсь что-то такое использовать, надёжнее вычитать и сравнивать с минимальным значимым.

К java.time претензий нет.

Нууу. Пока нет.

crutch_master ★★★★★
() автор топика
Ответ на: комментарий от ma1uta

Надо же, идея обманула меня. Да, согласен. Тогда претензии топикстартера разумны, т.к. класс нарушает контракт Object.equals. Как я и говорил, это старое API кривое.

Legioner ★★★★★
()
Последнее исправление: Legioner (всего исправлений: 2)
Ответ на: комментарий от ma1uta

И чему же у тебя будет равен твой long для 1 месяца?

По-разному в зависимости от календаря.

Внезапно, время - это время.

Время это 9 192 631 770 периодов электромагнитного излучения, возникающего при переходе между двумя сверхтонкими уровнями основного состояния атома цезия-133. Внезапно, это тупо целое число.

В частности косяк из-за того, что это long.

И на что бы ты заменил long? На григорианский календарь? АМС у нас нет, время ни для чего другого, кроме бухучёта считать не нужно. Целое - это универсальная величина, по которой можно хоть марсианский календарь высчитывать.

crutch_master ★★★★★
() автор топика
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от crutch_master

Время это 9 192 631 770 периодов электромагнитного излучения, возникающего при переходе между двумя сверхтонкими уровнями основного состояния атома цезия-133. Внезапно, это тупо целое число.

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

MetalBeaver
()
Ответ на: комментарий от MetalBeaver

Если решил упороться по физике

Мы говорим о времени в информатике. А оно синхронизируется с атомных часов, где секунда - это целое число распадов. Это целое, оно универсально и ничем не может и не должно быть кроме целого. Ты против? Давай, покажи свою убогую альтернативу.

crutch_master ★★★★★
() автор топика
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от ya-betmen

а тут макака не умеет в даты.

У меня все хорошо с датами. К счастью это всё еще long.

Зашёл почитать что-то интересное

Тут очень интересно. Кхм... рассказывают, что long не нужен. Давай, покажи, как ты умеешь в даты. Посмеюсь.

crutch_master ★★★★★
() автор топика
Последнее исправление: crutch_master (всего исправлений: 4)
Ответ на: комментарий от crutch_master

Это целое, оно универсально и ничем не может и не должно быть кроме целого.

Семантика разная. В твоем мирке, если вычесть из сегодня вчера, получится 1 января 1970го.

RedPossum ★★★★★
()
Ответ на: комментарий от RedPossum

Семантика разная.

Семантика чего? Календарный день везде будет 1000*60*60*24 мс. Неделя - условно 7 дней. Месяц и год разной длинны. Если ты сравниваешь 2 даты, то всё равно приводишь всю свою «семантику» в long, попутно танцуя на граблях с timezone. Если нужен не календарный день, надо опять танцевать вокруг long.

crutch_master ★★★★★
() автор топика
Последнее исправление: crutch_master (всего исправлений: 2)
Ответ на: комментарий от crutch_master

Мы говорим о времени в информатике.

О информатике в вакууме или всё таки применительно к каким-то приземлённым задачам? Если о информатике в вакууме, то непонятно, зачем ты сюда приплёл физику, потому что в информатике время не определяется через физические явления. Если же применительно к практическим задачам, то тут могут быть и иоттосекунды, и различные календари, и вообще всё, что угодно.

MetalBeaver
()
Ответ на: комментарий от crutch_master

Вот эти детали реализации должны быть от тебя надежно сокрыты и тебя волновать не должны (до известной степени)

RedPossum ★★★★★
()
Ответ на: комментарий от MetalBeaver

О информатике в вакууме или всё таки применительно к каким-то приземлённым задачам?
MetalBeaver (30.10.2018 17:30:49)

Да. Форум в интернете, например, организовать.

потому что в информатике время не определяется через физические явления

А через что оно определяется? Атомные часы тебе что выдают? Выхлоп libastral?

Если же применительно к практическим задачам, то тут могут быть и иоттосекунды

Могут. Если есть, чем их можно точно посчитать.

различные календари

Про календари см.выше. Могут быть любые календари, хоть еврейские и марсианские. Long'ом потому и считают время, что он универсален и его можно выразить в любых календарях днями месяцами и хоть чёртями лысыми.

crutch_master ★★★★★
() автор топика
Ответ на: комментарий от RedPossum

Вот эти детали реализации должны быть от тебя надежно сокрыты

Какие детали? Long? Это одна делать. И меня волнует только то, чтобы он был. А вот всё остальное, типа кривых реализаций equals - не волнует совершенно. И почему от меня это должно быть скрыто?

crutch_master ★★★★★
() автор топика
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от crutch_master

У тебя функция, которая возвращает некий период, который будет складываться с различными датами. В данный момент функция вернула 1 месяц. В следующий раз вернёт 2 недели или 4 рабочих дня. Так как время у тебя - это long, то какое значения одного long ты вернёшь для 1 месяца?

ma1uta ★★★
()
Ответ на: комментарий от crutch_master

Почитай про координационную секунду, пожалуйста, и ты узнаешь, что календарный день не везде будет 1000*60*60*24 мс.

ma1uta ★★★
()
Ответ на: комментарий от crutch_master

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

И тут еще на помощь приходит Java, в которой операция equals - метод Object и реализовывается один раз при реализации самого класса. Это не какая-то группа Scala/Rust трейтов, которые можно присобачить потом для всех немыслимых конкретных типов. Потому все что предусмотрели - то может быть equals, что нет, то false.

Как правило другие классы - false. Вот почему.

Оно симметрично должно быть. Сделал equals для другого класса. Пойди в тот класс и сделай equals для этого.

И еще должно быть транзитивно. Сделал equals для А на Б, то кроме того что Б на А надо реализовать, так еще если есть Б на В, то надо и В на Б и В на А. Короче в каждом классе нужно реализовать или немыслимый комбинаторный набор всех возможных пар. Или сделать приведение всех классов к общему и его сравнивать. Даже если ты не хочешь создавать на каждом equals новый обьект - должен.

Чтобы не заниматься этой гимнастикой, equals сделан только между экземплярами одного и того же самого класса. Если программисту нужно, пусть сам приведет к общему.

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

vertexua ★★★★★
()
Последнее исправление: vertexua (всего исправлений: 1)
Ответ на: комментарий от crutch_master

Я как минимум различаю даты и лонги и не возмущаюсь когда сравнение разных типов данных дает разные результаты.

Ну и да, лонг нужен.

ya-betmen ★★★★★
()
Ответ на: комментарий от RedPossum

если вычесть из сегодня вчера, получится 1 января 1970го

а что получится в твоём, семантически верном мирке?

anonymous
()

Умничать будете на собеседовании.

Или в собесе.

Bioreactor ★★★★★
()
Ответ на: комментарий от anonymous

Не скомпилируется, конечно. Время, которое “wall clock”, нечего позволять вычитать. Надо метод поддобавить, который разницу найдёт и вернёт совершенно другой тип данных.

RedPossum ★★★★★
()
Ответ на: комментарий от crutch_master

Лонг можно умножить на 2, например. Какой смысл имеет умножение на 2 количества секунд от 1970? Никакого. Именно потому лонг и должен быть скрыт.

anonymous
()
Ответ на: комментарий от anonymous

В семантически верном мирке операция «минус», примененная к переменным типа времени возвращает длительность - другой тип, не время.

anonymous
()
Ответ на: комментарий от ma1uta

Так как время у тебя - это long, то какое значения одного long ты вернёшь для 1 месяца?

В зависимости от контекста. Без контекста он будет undefinded. И кастишь ты его всё равно в итоге в long, когда у тебя абстрактный период твоего местного календаря превращается в конкретную дату.

crutch_master ★★★★★
() автор топика
Ответ на: комментарий от vertexua

Чтобы не заниматься этой гимнастикой, equals сделан только между экземплярами одного и того же самого класса. Если программисту нужно, пусть сам приведет к общему.

И тут внезапно выясняется, что эти два класса реализуют java.util.Date. Почему бы не использовать equals с него, если у них так много общего? Но если нет и раз у них там куча своих велосипедов, может есть смысл НЕ наследовать все их от java.util.Date?

Ты истеричка

Истерика только у тебя в голове. Я сразу сделал по-царски. Всё нормально.

и тут не в двух датах проблема, а надо или из всей

Java сделать не Java, а новый язык Может не надо зоопарк разводить, а раз разводят, то не надо старую совместимость лопать?

Это не какая-то группа Scala/Rust трейтов, которые можно присобачить потом для всех немыслимых конкретных типов.

Я и не хочу, чтобы они реализовывали что-то для всех немыслимых типов. Классы расширяют/возвращают Date, в котором всё deprecated, кроме long. Какого хрена родительский класс не должен работать с другими такими же родительскими классами, где есть такой же long и похоронили всю семантику мне не понятно.

crutch_master ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Давай, расскажи, что у тебя получается на деле. Мне уже интересно.

crutch_master ★★★★★
() автор топика
Ответ на: комментарий от ya-betmen

Я как минимум различаю даты и лонги и не возмущаюсь когда сравнение разных типов данных дает разные результаты.

Это данные одного типа. java.util.Date. Какой там потомок внутри меня волновать должно? Если да, то почему.

crutch_master ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Лонг можно умножить на 2, например. Какой смысл имеет умножение на 2 количества секунд от 1970? Никакого.

Операция идёт 2 минуты, надо посчитать сколько будет идти 2048 таких операций и вычислить дату окончания всего этого процесса. Я перевожу 2 минуты в лонг, умножаю на 2048, беру текущую дату в лонг, прибавляю к ней то, что получилось, перевожу то, что получилось в дату. Что делаешь ты?

crutch_master ★★★★★
() автор топика
Ответ на: комментарий от RedPossum

Надо метод поддобавить, который разницу найдёт и вернёт совершенно другой тип данных.

Всё твои типы данных - костыли вокруг твоего местного костыльного календаря с високосным годами и координационными секундами.

crutch_master ★★★★★
() автор топика
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от crutch_master

Я тебе написал контекст, у тебя функция, которая по различным входным параметрам выдаёт период (например, 1 месяц). Дальше этот период складывается с различными датами. У тебя дата - это long, вот что ты будешь возвращать в этом long-е для 1 месяца?

И нет, никто не будет кастить в long, а будет складывать даты.

ma1uta ★★★
()
Ответ на: комментарий от ma1uta

У тебя дата - это long, вот что ты будешь возвращать в этом long-е для 1 месяца?

Я верну абстрактный «месяц» пегероню его в long в зависимости от контекста, прибавлю.

И нет, никто не будет кастить в long

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

crutch_master ★★★★★
() автор топика
Ответ на: комментарий от crutch_master

Я верну абстрактный «месяц» пегероню его в long в зависимости от контекста, прибавлю.

И как ты вернёшь абстрактный «месяц» в одном long-е? А в следующий раз будет не месяц, а «3 рабочих дня». Как их ты запихаешь в long?

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

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

ma1uta ★★★
()
Ответ на: комментарий от ma1uta

Внезапно, время - это время. И чему же у тебя будет равен твой long для 1 месяца?

Мою веру в человечество убило то, что unix-секунда в общем случае не равна физической секунде даже по длине. ИМХО, это песец, товарищи :)

KRoN73 ★★★★★
()
Ответ на: комментарий от crutch_master

Всегда думал, что equals - это значит эквивалентные.

Я на эти грабли в начале Java-картеры наступил со сравнением Integer по ==. При чём особенно болезненное наступление было от того, что до 127 оно работает, а выше — уже нет :D Тесты прошли, а программа периодически глючит…

KRoN73 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.