Java-将unix时间(以毫秒为单位)与时区转换为时间戳
我有一个字符串,例如:Java-将unix时间(以毫秒为单位)与时区转换为时间戳,java,time,timezone,unix-timestamp,converters,Java,Time,Timezone,Unix Timestamp,Converters,我有一个字符串,例如: 1517439600000+0100 我想把它转换成unix时间,单位为毫秒,没有时区。 我怎么做 p、 美国。 1) 我不能使用子字符串(0,5)并向字符串中添加360万毫秒,因为我有很多时区,一次是+0100,然后是+0200等等 2) 如果更容易转换为常规时间戳,如YYYY-mm-dd hh:mm:ss 应该没问题。您可以执行以下操作: String sign = "+"; String [] parts = time.split(sign);
1517439600000+0100
我想把它转换成unix时间,单位为毫秒,没有时区。
我怎么做
p、 美国。
1) 我不能使用子字符串(0,5)
并向字符串中添加360万毫秒,因为我有很多时区,一次是+0100,然后是+0200等等
2) 如果更容易转换为常规时间戳,如YYYY-mm-dd hh:mm:ss
应该没问题。您可以执行以下操作:
String sign = "+";
String [] parts = time.split(sign);
Long millis = Long.parseLong(parts[0]);
String zoneOffset = sign + parts[1];
LocalDate date = Instant.ofEpochMilli(millis).atZone(ZoneOffset.of(zoneOffset)).toLocalDate();
输出:
2018-02-01T00:00+01:00
自历元起的毫秒数(1517 439 600 000)表示独立于时区或偏移量的时间点。因此,为了获得时间戳,解析这个数字就足够了。如果您对即时
(本例中为2018-01-31T23:00:00Z)感到满意,您当然可以删除最后一半代码。我的风格是在我不需要所有信息的时候,也从字符串中获取所有信息
我用于拆分的正则表达式,(?=[+-])
,是一个积极的前瞻:它匹配+
或-
前面的空字符串。匹配空字符串很重要,因此在拆分过程中不会丢失字符串的任何部分(我们需要保留符号)
解析偏移量的一种更简单的方法是
ZoneOffset.of(parts[1])
(正如NiVeR在另一个答案中所做的那样)。唯一的区别是,我使用的DateTimeFormatter
还验证了格式是否确实像+0100
(无冒号)或Z
1517439600000+0100的格式是什么?当输入为1517439600000+0100
?2018-FEB-01 00:00和UTC+1时,期望的输出是什么(UTC+2将于2018年2月1日01:00:00)
String exampleString = "1517439600000+0100";
// Split string before + or-
String[] parts = exampleString.split("(?=[+-])");
if (parts.length != 2) {
throw new IllegalArgumentException("Unexpected/unsupported format: " + exampleString);
}
// Parse the milliseconds into an Instant
Instant timeStamp = Instant.ofEpochMilli(Long.parseLong(parts[0]));
// Parse the offset into a ZoneOffset
DateTimeFormatter offsetFormatter = DateTimeFormatter.ofPattern("xx");
ZoneOffset offset = ZoneOffset.from(offsetFormatter.parse(parts[1]));
// Combine
OffsetDateTime dateTime = timeStamp.atOffset(offset);
System.out.println(dateTime);