Как конвертировать unix метка времени в дату - PullRequest
0 голосов
/ 28 января 2020

Я пытаюсь преобразовать Unix отметку времени в дату

    final DateTimeFormatter formatter = 
            DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    final String startdate = Instant.ofEpochSecond(Long.parseLong(requestVO.getStartDate().toString()))
            .atZone(ZoneId.of("GMT-4"))
            .format(formatter);

        final String enddate = Instant.ofEpochSecond(Long.parseLong(requestVO.getEndDate().toString()))
                .atZone(ZoneId.of("GMT-4"))
                .format(formatter);

выше - это то, что я пробовал для формата даты. Упоминается в DateTimeFormatter, а requestVO.getStartDate () дает значение типа Date. Я применяю startDate и endDate в запросе sql Как показано ниже

and ceo.erx_date between '"+startdate+"' and '"+enddate+"' 

Не получено ошибок компиляции, но с исключением числового формата.

Ответы [ 2 ]

0 голосов
/ 28 января 2020

tl; dr

myJavaUtilDate                               // The terrible `java.util.Date` class is the legacy way to represent a moment in UTC.
.toInstant()                                 // `Instant` is modern way to represent a moment in UTC.
.atZone(                                     // Adjust from UTC to some time zone.
    ZoneId.of( "America/Martinique" )        // Specify the time zone you had in mind for an offset of four hours behind UTC. 
)                                            // Returns a `ZonedDateTime` object.
.format(                                     // Generate text representing the value of our `ZonedDateTime` object's content.
    DateTimeFormatter.ISO_LOCAL_DATE_TIME    // A predefined formatter per ISO 8601 that omits any indication of time zone or offset-from-UTC.
)
.replace(
    "T" ,                                    // Standard ISO 8601 formats use a `T` between the date and time-of-day portions.
    " " 
)                                            // Returns a `String`. 

java.util.Date::toInstant

requestVO.getStartDate () дает значение типа Date.

Вы работаете слишком сложно.

Преобразуйте ужасный объект класса Date в его современную замену Instant. Обратите внимание, как унаследованные классы получили новые методы для преобразования в / из современных java .time . Ищите to… & from… методы на старых классах. В этом случае Date::toInstant.

Instant instant = myJavaUtilDate.toInstant() ;

Зона и смещение

.atZone (ZoneId.of ("GMT-4"))

Нет, -4 - это не часовой пояс. Это смещение.

Смещение от UT C всего на несколько часов-минут-секунд вперед или позади основного меридиана.

Часовой пояс намного больше. Часовой пояс - это история прошлых, настоящих и будущих изменений смещения, используемых людьми определенного региона. Часовой пояс носит имя в формате Continent/Region, например Asia/Kolkata или Pacific/Auckland.

Лучше использовать часовой пояс, чем простое смещение. Во-первых, вы можете ошибаться в смещении. Используя часовой пояс, java .time будет определять смещение, действующее в нужный момент.

Зона смещения на четыре часа после UT C

Возможно, под -4 вы имеете в виду часовой пояс, такой как America/Martinique, America/Aruba или America/Puerto_Rico.

ZoneId z = ZoneId.of( "America/Puerto_Rico" ) ;

Instant + ZoneIdZonedDateTime

Примените это ZoneId для создания ZonedDateTime объекта. Тот же момент, другое время настенных часов.

ZonedDateTime zdt = instant.atZone( z ) ;

Генерация текста

Создание строки в стандартном формате ISO 8601 , разумно расширенной, чтобы добавить название зоны в квадратных скобках.

String output = zdt.toString() ;

Но вы хотели формат, подобный ISO 8601 , но без T в середине и без индикатора смещения / зоны. Я не рекомендую сообщать момент без представления часового пояса или смещения. Но если вы настаиваете:

String output = 
        zdt
        .format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
        .replace( "T" , " " ) 
;
0 голосов
/ 28 января 2020

Если requestVo.getStartDate() возвращает объект Date, ваша ошибка здесь:

Long.parseLong(requestVo.getStartDate())

Как сказано в документации , Long.parseLong(String) throws

NumberFormatException - если строка не содержит анализируемого long.

Попробуйте это:

Long.parseLong(requestVo.getStartDate().getTime())

В каждом случае две вещи:

  1. Позаботьтесь о NullPointerException: проверьте, является ли ваша дата нулевой или нет
  2. Используйте подготовленное состояние, а не конкатенацию строк при написании электронного запроса в Java

Существует как минимум две причины использовать PreparedStatement вместо Statement:

  1. Они быстрее простых Statement: потому что Statement компилируются и выполняются каждый раз, а PreparedStatment компилируются один раз
  2. В случае PreparedStatement вы в безопасности с точки зрения SQL впрыска
...