以日期时间格式转换纪元日期 1980-01-01
Convert Epoch Date in Date time format 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-07-21 12:14:20 这种格式
我得到 1980-01-01
的错误输出
您可以通过以下方式将长日期转换为日期:
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
String date=dateFormat.format(new Date(long timeInMillis));
我想下面就是你想要的。
即使您在 Android 上,因此没有内置现代 Java 日期和时间 API,我仍在使用它,因为它更方便,特别是对于这种操作。你在 ThreeTenABP, see .
中得到它
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
and/or GregorianCalendar
类,但它们很麻烦且容易出错,请注意。
这是我的代码
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
的错误输出您可以通过以下方式将长日期转换为日期:
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
String date=dateFormat.format(new Date(long timeInMillis));
我想下面就是你想要的。
即使您在 Android 上,因此没有内置现代 Java 日期和时间 API,我仍在使用它,因为它更方便,特别是对于这种操作。你在 ThreeTenABP, see
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
and/or GregorianCalendar
类,但它们很麻烦且容易出错,请注意。