以日期时间格式转换纪元日期 1980-01-01

Posted

技术标签:

【中文标题】以日期时间格式转换纪元日期 1980-01-01【英文标题】:Convert Epoch Date in Date time format 1980-01-01 【发布时间】:2017-12-28 22:09:15 【问题描述】:

这是我的代码

private Date getReferenceDate(int seg) 

    switch (seg) 
        case 1:
        case 2:
        case 3:
            return new Date(1980-01-01);
        case 31:
        case 32:
        case 33:
            return new Date(1970-01-01);
        default:
            return new Date(1980-01-01);
    


 private Date getDateFormat(int time, int seg) 
    Date date = getBaseReferenceDate(seg);
    date.setSeconds(date.getSeconds() + time);
    date.setHours(date.getHours() - 5);
    date.setMinutes(date.getMinutes() - 30);
    date.setSeconds(date.getSeconds()-1);
    return date;

我有 1185106460 格式的日期 我想把它转换成 2017-07-21 12:14:20 这种格式 我得到了 1980-01-01 的错误输出

【问题讨论】:

不清楚,抱歉。你的意思是如果seg 是 1、2 或 3,那么你想在 1980-01-01 的基础上加上 1185106460 秒?然后对时区进行一些调整?我只是在这里开玩笑。 如果 seg 是 1,2,3 我想要日期格式 1980-01-01 1185106460 是通过 date.setSeconds(date.getSeconds() + time); date.setHours(date.getHours() - 5); date.setMinutes(date.getMinutes() - 30); date.setSeconds(date.getSeconds()-1); 它并没有让它更清楚。此外,您所需的格式仅包括日期,但您说想要的结果也包括时间。你真正想要哪个? 我想要日期......基本上我得到的输出是 1970-01-01 格式的 2007-7-22,但我想要输出 2017-7-21 的 1980-01-01 格式跨度> 【参考方案1】:

我认为以下是您想要的。

即使您使用的是 android,因此没有内置现代 Java 日期和时间 API,但我使用它是因为它更方便,尤其是对于此类操作。您可以在ThreeTenABP 中获得它,请参阅How to use ThreeTenABP in Android Project。

private static OffsetDateTime getReferenceDate(int seg) 
    int baseYear = 1970;
    if (seg >= 31 && seg <= 33) 
        baseYear = 1980; 
    
    return OffsetDateTime.of(LocalDate.of(baseYear, Month.JANUARY, 1), 
                             LocalTime.MIDNIGHT,
                             ZoneOffset.UTC);


private static OffsetDateTime getDateFormat(int time, int seg) 
    return getReferenceDate(seg).plusSeconds(time);

看看效果:

    System.out.println(getDateFormat(1185106460, 1));

打印出来:

2007-07-22T12:14:20Z

这是您要求的日期和时间。

如果您只想要 yyyy-mm-dd 格式的日期:

    System.out.println(getDateFormat(1185106460, 1)
            .format(DateTimeFormatter.ISO_LOCAL_DATE));

打印出来

2007-07-22

如果您需要一个过时的Date 对象,例如一些您无法更改的旧版 API:

    System.out.println(DateTimeUtils.toDate(getDateFormat(1185106460, 1).toInstant()));

在我的电脑上打印:

Sun Jul 22 14:14:20 CEST 2007

时间点相同,只是 Date.toString() 将其格式化为 JVM 的时区设置。在 Java 8 或更高版本中,转换将是

    System.out.println(Date.from(getDateFormat(1185106460, 1).toInstant()));

你做错了什么?首先,你使用了 Date 中已弃用的方法。这些被弃用是有原因的,它们跨时区不可靠,所以你不想使用它们。您可能还打算使用已弃用的 Date 构造函数之一,但您使用的是未弃用的构造函数。 1980-01-01 是一个有两个减法的算术表达式。 01 是一个值为 1 的八进制整数文字,因此表达式的结果是 1978。您将 1978 传递给构造函数 Date(long date),它们被解释为自纪元 1970-01-01T00:00 以来的毫秒数:00Z。

如果您打算将提到的时期作为参考,那么您已经接近了,只差了 1968 毫秒。我怀疑你最后减去 1 秒是你试图弥补这一点。如果您打算使用 1980 年的参考值,那么您有 10 年的时间,节省了 1978 毫秒。这导致了这个问题。

无论如何,Date 早已过时,不适合您尝试做的事情。正如我所说,我推荐 ThreeTenABP。如果您真的,真的不想依赖外部库(直到现代 API 出现在 Android 上),您可以查看 Calendar 和/或 GregorianCalendar 类,但它们很麻烦且容易出错,只是被警告。

【讨论】:

非常感谢先生,我能理解我的错误【参考方案2】:

您可以通过以下方式将长日期转换为日期:

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
String date=dateFormat.format(new Date(long timeInMillis));

【讨论】:

以上是关于以日期时间格式转换纪元日期 1980-01-01的主要内容,如果未能解决你的问题,请参考以下文章

将 UTC 纪元转换为本地日期

Javascript将日期时间字符串转换为纪元

使用 PHP 将 mm/dd/yyyy 格式转换为纪元

在纪元中转换日期格式

将纪元转换为时间戳时获取不正确的日期

比较特定时间间隔的不同格式的纪元日期