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