罗勒·布尔克(BasilBourque)的答案很不错。从小数部分中取出纳秒到一个纳秒整数可能会导致一个或两个陷阱。我建议:
String dateInMillis = "1413225446.92000"; String[] secondsAndFraction = dateInMillis.split("\."); int nanos = 0; if (secondsAndFraction.length > 1) { // there’s a fractional part // extend fractional part to 9 digits to obtain nanoseconds String nanosecondsString = (secondsAndFraction[1] + "000000000").substring(0, 9); nanos = Integer.parseInt(nanosecondsString); // if the double number was negative, the nanos must be too if (dateInMillis.startsWith("-")) { nanos = -nanos; } } ZonedDateTime zdt = Instant .ofEpochSecond(Long.parseLong(secondsAndFraction[0]), nanos) .atZone(ZoneId.of("Asia/Manila")); System.out.println(zdt);此打印
2014-10-14T02:37:26.920+08:00[Asia/Manila]
纳秒级不需要64位,因此我只是使用
int。
假设:我假设您的字符串包含一个浮点数,并且可以对其进行签名,例如,
-1.50这意味着在纪元开始 前
一秒半。如果某一天的时间用科学计数法(1.41322544692E9)来表示,则以上内容将无效。
如果不是亚洲/马尼拉,请以 _区域/城市_格式替换所需的时区,例如,美国/温哥华,美国/洛杉矶或太平洋/皮特凯恩。避免使用PST等三个字母缩写,因为它们是模棱两可的,通常不是真实的时区。



