Как добавить длинный суффикс l в Java

Я на самом деле борюсь с тем, как добавить суффикс «L» к длинному значению.

Сервисы JSON предоставляют мне временные метки в секундах. В своем выводе я хотел бы привести эту кучу секунд в каком-то удобочитаемом формате. Поэтому я хотел бы использовать SimpleDateFormat, у которого должна быть отметка времени в миллисекундах.

Итак, у меня есть значение 1545151800 в секундах. Чтобы перевести i в миллисекунды, это будет (* 1000) 1545151800000

Поскольку он длинный, он должен иметь значение 1545151800000L.

Как я могу добавить букву «L» к моему значению? Невозможно добавить некоторые символы в длинный. Если меня не волнует суффикс "L", я получаю другие (неправильные) результаты.

умножить на 1000L

Eran 18.12.2018 19:30

В общем случае, если у вас есть значение int (x) и вам нужно значение long, вы можете преобразовать его: (long)x. Но если вы делаете что-то вроде умножения на другое значение, поскольку int * long дает long, вы можете сделать x * 1000L.

T.J. Crowder 18.12.2018 19:32

L предназначен только для кода Java и ничего не делает во время выполнения. Как вы говорите, у long нет символа, поэтому в этом нет никакого смысла. однако int * int - это int, поэтому это значение может переполняться. Если вы сделаете int * long, результатом будет long, который в вашем случае может не переполниться.

Peter Lawrey 18.12.2018 19:36

@ T.J.Crowder У меня уже есть длинная, но не хватает последних трех цифр, поэтому x * 1000L тоже был бы моим предложением. Проблема в том, что SimpleDateFormat все еще не распознает мою метку времени.

pbur 18.12.2018 19:37

Вот мой код для SimpleDateFormat: @XmlElement(name = "dt") long timeOfData; long timeOfDataL = timeOfData*1000L; String humanTimeOfData = new SimpleDateFormat("dd/MM/yyyy", Locale.US).format(new Date(timeOfDataL));

pbur 18.12.2018 19:38

Этот 1545151800 должен быть 2018-12-18T16:50:00+00:00

Peter Lawrey 18.12.2018 19:39

@PeterLawrey Да, я и ожидал такого результата. Но я не могу этого добиться, потому что SimpleDateFormat требует ввода длиной в миллисекундах, которого у меня нет, и мне нужно его преобразовать.

pbur 18.12.2018 19:41

Кроме того, вам следует посмотреть на Instant.ofEpochSecond.

chrylis -cautiouslyoptimistic- 18.12.2018 20:03

@pbur - В показанном вами коде, если timeOfData действительно получает значение 1545151800, меня устраивает.

T.J. Crowder 18.12.2018 20:06
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
9
521
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Наконец-то у меня есть решение. Проблема была не в суффиксах вроде T.J. - указал Краудер. Это было связано с моей службой JAXB и json.

До исправления

После помещения двух строк в мой метод toString () все работало нормально. timeOfDataL уже использовался, в то время как timeOfData был все еще равен 0. Итак, 0 привело к 01.01.1970

После исправления

Спасибо, что поделились своим открытием и исправлением. Только не используйте SimpleDateFormat и Date. Эти классы плохо спроектированы и давно устарели. Сегодня у нас намного лучше в java.time, современный API даты и времени Java. В качестве второстепенного момента он может даже преобразовать непосредственно из секунд с эпохи и сэкономить вам умножение на 1000.

Ole V.V. 18.12.2018 21:57

java.time

    String humanDateOfData = Instant.ofEpochSecond(timeOfData)
            .atZone(ZoneId.systemDefault())
            .format(dateFormatter);

Вы можете объявить средство форматирования даты только один раз в своем классе, а не создавать новый для каждого вызова toString:

static DateTimeFormatter dateFormatter
        = DateTimeFormatter.ofPattern("dd/MM/uuuu", Locale.US);

На моем компьютере в часовом поясе Европа / Копенгаген это дало humanDateOfData из 18/12/2018, который теперь вы можете использовать в качестве возвращаемого значения из toString.

В этом случае это код длиннее, чем код, который у вас есть, но я все же настоятельно рекомендую его. Классы даты и времени, которые вы использовали, Date и SimpleDateFormat, плохо спроектированы, а последнее, как известно, доставляет неудобства. К тому же они давно устарели. Вместо этого я использую java.time, современный API даты и времени Java, выпущенный в 2014 году. Кроме того, хотя умножение на 1000 может показаться простым, выполнение собственных преобразований времени очень часто является сложным и подверженным ошибкам, поэтому это плохая привычка. чтобы попасть в. Instant напрямую принимает секунды с эпохи, поэтому он больше не нужен. Наконец, современный код явно указывает на то, что часовой пояс используется для определения даты, мне это нравится. Если вы знаете часовой пояс, вы также можете указать какой, например, ZoneId.of("Asia/Harbin").

Лонк:Учебник Oracle: Дата и время

Другие вопросы по теме