【发布时间】:2019-07-21 19:16:29
【问题描述】:
我想获得timeStamp 并考虑在Android 中使用Java 中的TimeZone,
我尝试了很多方法,但仍然找不到解决方案。
【问题讨论】:
-
获取ThreeTenABP 库并使用
ZonedDateTime类。如果不是这样,请编辑问题并详细说明“考虑时区”的含义。
标签: java android time timestamp
我想获得timeStamp 并考虑在Android 中使用Java 中的TimeZone,
我尝试了很多方法,但仍然找不到解决方案。
【问题讨论】:
ZonedDateTime 类。如果不是这样,请编辑问题并详细说明“考虑时区”的含义。
标签: java android time timestamp
您可以使用此方法获取带有时区的时间戳:
public static long getTimestampWithGMT() {
long timestamp = System.currentTimeMillis() / 1000;
int offset = (TimeZone.getDefault().getRawOffset() + TimeZone.getDefault().getDSTSavings()) / 1000;
return timestamp + offset;
}
【讨论】:
使用 java.time 包中的 ZoneId 和 ZonedDateTime 类。
ZonedDateTime.now() // Implicitly applies the JVM’s current default time zone.
最好明确指定您想要/预期的时区。
ZonedDateTime.now(
ZoneId.of( "Africa/Tunis" )
)
现代方法使用 java.time 类,这些类在几年前取代了可怕的遗留类,例如 Timestamp、Calendar、Date、TimeZone 和 SimpleDateFormat。
以Continent/Region 的格式指定proper time zone name,例如America/Montreal、Africa/Casablanca 或Pacific/Auckland。切勿使用 2-4 个字母的缩写,例如 EST 或 IST,因为它们不是真正的时区,没有标准化,甚至不是唯一的 (!)。
ZoneId z = ZoneId.of( "America/Montreal" ) ;
通过特定地区(上述时区)的人们使用的挂钟时间捕捉当前时刻。
ZonedDateTime zdt = ZonedDateTime.now( z ) ;
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。
从哪里获得 java.time 类?
【讨论】:
你可以使用 Calendar.getInstance().getTimeInMillis() 吗?它默认为设备时区,或者如果您想更改时区,您可以执行以下操作
Calendar calendar = Calendar.getInstance();
calendar.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));
calendar.getTimeInMillis();
【讨论】:
getTimeInMillis() "将当前时间返回为距纪元的 UTC 毫秒数"(引用 javadoc),因此设置时区无效,您也可以只需致电System.currentTimeMillis()。
您可以使用 Calendar 类来获取当前时间戳。然后您可以格式化此时间戳以显示日期、日期、月份、年份、时间等。
Calendar c = Calendar.getInstance();
【讨论】:
java.util.Date、java.util.Calendar 和 java.text.SimpleDateFormat 现在是 legacy,被 Java 8 中内置的 java.time 类所取代,之后。见Tutorial by Oracle。