Как конвертировать эпоху в метку времени MySQL в JAVA

Как получить формат отметки времени MySQL в mySQLtimestamp?

long epochNow = System.currentTimeMillis()/1000;
long epochWeek = 604800;
long date7daysAgo = epochNo2013 w - epochWeek;
String mySQLtimestamp = /* 2013-09-23:50:00 */ 

2 ответа

Решение

Почему бы не использовать нормальный Date все это время?

Calendar cal = Calendar.getInstance();
cal.add(Calendar.DAY_OF_MONTH, -7);
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
String output = formatter.format(cal.getTime());

java.time

С выпуском Java SE 8 в марте 2014 г. устаревший и подверженный ошибкам устаревший API Date-Time ( java.util Типы даты и времени и тип их форматирования, SimpleDateFormatи т. д.) был заменен современным API даты и времени * . В показано сопоставление типов ANSI SQL с java.time типы:

Обратите внимание, что ZonedDateTime, а также OffsetTime / TIME [ WITHOUT TIMEZONE ]не поддерживаются. Также обратите внимание, что все экземпляры должны быть в формате UTC (иметь смещение 0). Это потому, что серверная часть хранит их как UTC.

Как использовать это в JDBC?

Ниже приведен пример кода для вставки текущего значения в формате UTC в (который имеет TIMESTAMP WITH TIMEZONE тип):

      OffsetDateTime odt = Instant.now().atOffset(ZoneOffset.UTC);
PreparedStatement st = conn.prepareStatement("INSERT INTO mytable (columnfoo) VALUES (?)");
st.setObject(1, odt);
st.executeUpdate();
st.close();

An Instant представляет мгновенную точку на временной шкале и не зависит от часового пояса, т.е. имеет смещение часового пояса в часах.

Ниже приведен пример кода для получения из columnfoo:

      Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("SELECT * FROM mytable WHERE <some condition>");
while (rs.next()) {
    // Assuming the column index of columnfoo is 1
    OffsetDateTime odt = rs.getObject(1, OffsetDateTime.class));
    System.out.println(odt);
}
rs.close();
st.close();

На всякий случай нужно преобразовать один в другой с другим смещением:

Есть несколько способов сделать это, но я в основном использую OffsetDateTime#withOffsetSameInstant, чтобы преобразовать один в другой с другим смещением часового пояса, например

      import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;

public class Main {
    public static void main(String[] args) {
        // A sample OffsetDateTime in UTC.
        OffsetDateTime odt = Instant.now().atOffset(ZoneOffset.UTC);
        System.out.println(odt);

        OffsetDateTime offsetTimeAtOffset0100 = odt.withOffsetSameInstant(ZoneOffset.of("+02:00"));
        System.out.println(offsetTimeAtOffset0100);

        // Time at JVM's default timezone offset
        ZoneOffset jvmTzOffset = ZonedDateTime.now(ZoneId.systemDefault()).getOffset();
        OffsetDateTime offsetTimeAtJvmTzOffset = odt.withOffsetSameInstant(jvmTzOffset);
        System.out.println(offsetTimeAtJvmTzOffset);
    }
}

Выход:

      2021-05-29T13:36:15.258076Z
2021-05-29T15:36:15.258076+02:00
2021-05-29T14:36:15.258076+01:00

Некоторые моменты, связанные с приведенным выше кодом:

  1. В Zна выходе - указатель часового пояса для смещения нулевого часового пояса. Это расшифровывается как Zulu и указывает Etc/UTC часовой пояс (смещение часового пояса +00:00 часы).
  2. Код преобразует odt на два экземпляра OffsetDateTime- каждый по-своему. Первый экземпляр имеет фиксированное смещение часового пояса в часах, а второй - смещение часового пояса JVM. Обратите внимание, что смещение часового пояса места, где наблюдается на летнее переходвремя, меняется в соответствии с летним / зимним временем. Следовательно, если в месте соблюдается летнее время, вместо использования фиксированного смещения часового пояса, например +02:00часы; мы должны получить его из API.
  3. Часовой пояс моей JVM Europe/London и в настоящее время его смещение +01:00 часы.

Узнайте больше о следующей таблицесовременном API даты и времени* из Trail: Date Time .


* По любой причине, если вам нужно придерживаться Java 6 или Java 7, вы можете использовать ThreeTen-Backport, который поддерживает большую часть функциональности java.time для Java 6 и 7. Если вы работаете над проектом Android и своим Android API уровень по-прежнему не соответствует Java-8, проверьте API-интерфейсы Java 8+, доступные через десугаринг, и Как использовать ThreeTenABP в Android Project .

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