2017-07-23 60 views
0

这是我的代码转换大纪元日期在日期时间格式1980-01-01

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年7月21日12点14分二十秒这个日期格式 我得到错误的输出1980-01-01

+0

这还不清楚,对不起。你的意思是说,如果'seg'是1,2或3,那么你想添加1185106460秒到1980-01-01的基数?然后对时区进行一些调整?我只是在这里做鬼脸。 –

+0

如果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); – skIndia

+0

它没有让它更清晰。同样你想要的格式只包括日期,但你说你想要的结果也包括一天的时间。你真的想要哪个? –

回答

-1

您可以通过以下步骤转换日期长日期:

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

我认为下面是你想要的。

即使你在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类,但是它们很麻烦并且错误,只是需要警告。

+1

非常感谢先生,我可以理解我的错误 – skIndia