sqlite将时间戳转换为日期

时间:2016-05-05 01:43:37

标签: java sqlite date timestamp

如何将时间戳值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);
}}

我做错了什么?

1 个答案:

答案 0 :(得分:0)

您的问题与两种不同的输入不一致。首先我们将查看整个秒数,然后我们将以小数分数查看输入。

整秒

当输入是epoch reference date以来的秒数时,无需乘以一千。 Instant类提供静态方法ofEpochSecond来处理整秒。

OffsetDateTime

仅使用offset-from-UTC(或UTC本身)时,请使用OffsetDateTime类。 ZonedDateTime类用于分配全时区。完整时区是offset-from-UTC 加上一组用于处理Daylight Saving Time (DST)等异常的规则。

那么InstantOffsetDateTime分配的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 Answerthis 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