Я на самом деле борюсь с тем, как добавить суффикс «L» к длинному значению.
Сервисы JSON предоставляют мне временные метки в секундах. В своем выводе я хотел бы привести эту кучу секунд в каком-то удобочитаемом формате. Поэтому я хотел бы использовать SimpleDateFormat, у которого должна быть отметка времени в миллисекундах.
Итак, у меня есть значение 1545151800 в секундах. Чтобы перевести i в миллисекунды, это будет (* 1000) 1545151800000
Поскольку он длинный, он должен иметь значение 1545151800000L.
Как я могу добавить букву «L» к моему значению? Невозможно добавить некоторые символы в длинный. Если меня не волнует суффикс "L", я получаю другие (неправильные) результаты.
В общем случае, если у вас есть значение int
(x
) и вам нужно значение long
, вы можете преобразовать его: (long)x
. Но если вы делаете что-то вроде умножения на другое значение, поскольку int * long
дает long
, вы можете сделать x * 1000L
.
L
предназначен только для кода Java и ничего не делает во время выполнения. Как вы говорите, у long
нет символа, поэтому в этом нет никакого смысла. однако int * int
- это int
, поэтому это значение может переполняться. Если вы сделаете int * long
, результатом будет long
, который в вашем случае может не переполниться.
@ T.J.Crowder У меня уже есть длинная, но не хватает последних трех цифр, поэтому x * 1000L
тоже был бы моим предложением. Проблема в том, что SimpleDateFormat
все еще не распознает мою метку времени.
Вот мой код для SimpleDateFormat: @XmlElement(name = "dt") long timeOfData; long timeOfDataL = timeOfData*1000L; String humanTimeOfData = new SimpleDateFormat("dd/MM/yyyy", Locale.US).format(new Date(timeOfDataL));
Этот 1545151800
должен быть 2018-12-18T16:50:00+00:00
@PeterLawrey Да, я и ожидал такого результата. Но я не могу этого добиться, потому что SimpleDateFormat требует ввода длиной в миллисекундах, которого у меня нет, и мне нужно его преобразовать.
Кроме того, вам следует посмотреть на Instant.ofEpochSecond
.
@pbur - В показанном вами коде, если timeOfData
действительно получает значение 1545151800
, меня устраивает.
Наконец-то у меня есть решение. Проблема была не в суффиксах вроде T.J. - указал Краудер. Это было связано с моей службой JAXB и json.
После помещения двух строк в мой метод toString () все работало нормально. timeOfDataL уже использовался, в то время как timeOfData был все еще равен 0. Итак, 0 привело к 01.01.1970
Спасибо, что поделились своим открытием и исправлением. Только не используйте SimpleDateFormat
и Date
. Эти классы плохо спроектированы и давно устарели. Сегодня у нас намного лучше в java.time, современный API даты и времени Java. В качестве второстепенного момента он может даже преобразовать непосредственно из секунд с эпохи и сэкономить вам умножение на 1000.
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")
.
умножить на
1000L