如何将时间戳值444663422.631236转换为日期。我试过这些方法,但没有用。
public class Teste {
public static void main(String[] args) throws ParseException {
String l = "480364794";
String d = "479617200";
print(convertEpoc("444663422"));
print(convert("480364794", "dd/MM/yyyy HH:mm:ss"));
print(convert("479617200", "dd/MM/yyyy HH:mm:ss"));
}
private static String convertEpoc(String d) {
long epoch = Long.parseLong(d);
Instant instant = Instant.ofEpochMilli(epoch * 1000);
ZonedDateTime.ofInstant(instant, ZoneOffset.UTC);
return instant.toString();
}
public static String convert(String epochSec, String dateFormatStr) {
Date date = new Date(Long.parseLong(epochSec) * 1000);
SimpleDateFormat format = new SimpleDateFormat(dateFormatStr,
Locale.getDefault());
return format.format(date);
}
public static void print(String s) {
System.out.println(s);
}}
我做错了什么?
答案 0 :(得分:0)
您的问题与两种不同的输入不一致。首先我们将查看整个秒数,然后我们将以小数分数查看输入。
当输入是epoch reference date以来的秒数时,无需乘以一千。 Instant
类提供静态方法ofEpochSecond
来处理整秒。
OffsetDateTime
仅使用offset-from-UTC(或UTC本身)时,请使用OffsetDateTime
类。 ZonedDateTime
类用于分配全时区。完整时区是offset-from-UTC 加上一组用于处理Daylight Saving Time (DST)等异常的规则。
那么Instant
和OffsetDateTime
分配的UTC作为偏移量有什么区别?意义上没有区别,两者都代表着同一时刻。但OffsetDateTime
还有其他功能。一个这样的功能是在生成字符串表示时灵活格式化,而Instant
不是用于格式而不是其自己的toString
方法。
String input = "480364794";
Instant instant = Instant.ofEpochSecond ( Long.parseLong ( input ) );
OffsetDateTime odt = OffsetDateTime.ofInstant ( instant , ZoneOffset.UTC );
System.out.println ( "input: " + input + " | instant: " + instant + " | odt: " + odt );
跑步时。
输入:480364794 |时间:1985-03-22T18:39:54Z | odt:1985-03-22T18:39:54Z
对于小数秒的输入,将分数的整数秒分开。然后将每个方法传递给静态工厂方法,Instant.ofEpochSecond
采用两个参数。
获取这些数字的一种方法是BigDecimal
。我们不使用double
/ float
,因为这些数据类型会牺牲执行速度的准确性。
有关提取BigDecimal
的小数部分的讨论,请参阅this Question。请特别注意this Answer和this Answer。
BigDecimal input = new BigDecimal ( "444663422.631236" );
// Seconds
long seconds = input.longValue (); // = 444,663,422. Truncates the fraction. Only the whole number portion remains.
// Nanoseconds
BigDecimal fractionalSecond = input.remainder ( BigDecimal.ONE ); // = 0.631236. Truncates whole number. Only decimal fraction remains.
int decimalPlacesForNanoseconds = 9;
if ( fractionalSecond.scale () > decimalPlacesForNanoseconds ) { // Too many decimal places?
// FIXME: Handle this error condition. This means data loss as our input has a granularity finer than nanoseconds.
System.out.println ( "ERROR - Input finer than nanoseconds. Message # 0aa71e3b-6a5b-4ac4-b239-68e6b9f12284." );
}
BigInteger nanosBI = fractionalSecond.movePointRight ( decimalPlacesForNanoseconds ).toBigInteger (); // Make a whole number from the fraction.
long nanos = nanosBI.longValue ();
// Instant = ( Seconds + Nanoseconds )
Instant instant = Instant.ofEpochSecond ( seconds , nanos );
转储到控制台。
System.out.println ( "input: " + input + " | seconds: " + seconds + " | nanos: " + nanos + " | instant: " + instant );
跑步时。
输入:444663422.631236 |秒:444663422 | nanos:631236000 |时间:1984-02-03T13:37:02.631236Z