我有一个字符串,例如:
1517439600000+0100
,我想以毫秒为单位将其转换为unix时间,没有时区。 我该怎么办?
p.s。
1)我不能使用substring(0,5)
并向字符串添加3.6m毫秒,因为我有很多时区,一次是+0100,然后是+0200,等等...
2)是否更容易转换为常规时间戳,例如YYYY-mm-dd hh:mm:ss 应该没问题的。
答案 0 :(得分:1)
您可以执行以下操作:
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();
答案 1 :(得分:0)
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);
输出:
2018-02-01T00:00 + 01:00
自纪元(1 517 439 600 000)以来的毫秒数表示时间点,与时区或偏移量无关。因此,获取时间戳足以解析此数字。如果您对Instant
(示例中为2018-01-31T23:00:00Z)满意,则可以删除代码的后半部分。我的风格是当我不需要立即从字符串中获取所有信息时。
我用于拆分的正则表达式(?=[+-])
是一个积极的前瞻性:它与+
或-
之前的空字符串匹配。匹配空字符串很重要,因此在拆分过程中,字符串的任何部分都不会丢失(我们需要保留符号)。
解析偏移量的更简单方法是ZoneOffset.of(parts[1])
(就像NiVeR在另一个答案中所做的那样)。唯一的不同是,我使用的DateTimeFormatter
还可验证格式的确像+0100
(无冒号)或Z
。