Java日期格式化问题

Java日期格式化问题,java,date,Java,Date,我正在尝试使用Java Date类格式化一些日期。我有一些长值,我已经通过以前的计算得到。在我开始格式化任何日期之前,我有一个长列表,如下所示 -12345 0 12345 我做一些像这样的基本格式化 DateFormat df = new SimpleDateFormat("dd/MMM/yyyy HH:mm:ss"); String formattedDate = df.format(new Date(dateNumber.longValue())); 因为Java使用1970年初

我正在尝试使用Java Date类格式化一些日期。我有一些长值,我已经通过以前的计算得到。在我开始格式化任何日期之前,我有一个长列表,如下所示

-12345
0
12345
我做一些像这样的基本格式化

 DateFormat df = new SimpleDateFormat("dd/MMM/yyyy HH:mm:ss");
 String formattedDate = df.format(new Date(dateNumber.longValue())); 
因为Java使用1970年初作为基础,所以我的预期输出类似

31/Dec/1969 23:59:47
01/Jan/1970 00:00:00
01/Jan/1970 00:00:12
然而,我实际得到的结果是

31/Dec/1969 18:59:47
31/Dec/1969 19:00:00
31/Dec/1969 19:00:12

我有点困惑,为什么它们都在12月31日,而不是在12月31日和1月1日之间分开。由于列表中的后两个数字是正数,我无法理解为什么日期会在1970年之前。如果有人能用基本Java库帮我解决这个问题,我将不胜感激

你需要小心时区。看来你是美国东部时间。日期以UTC为准。当您打印时,您打印的是东部时间,因此您落后了5个小时。

您需要注意时区。看来你是美国东部时间。日期以UTC为准。打印时,您打印的是东部时间,因此您落后5小时。

您可以将数据格式对象的时区设置为GMT:

df.setTimeZone(TimeZone.getTimeZone("GMT"));

你应该得到你想要的。时间戳表示“自1970年1月1日00:00:00 GMT以来的毫秒数”,对于当前时区,结果将有所不同。

您可以将数据格式对象的时区设置为GMT:

df.setTimeZone(TimeZone.getTimeZone("GMT"));

你应该得到你想要的。时间戳表示“自1970年1月1日00:00:00 GMT以来的毫秒数”,对于您当前的时区,结果将有所不同。

其他答案是正确的,但已过时。正如他们所提到的,java.util.Date的许多不好的特性之一是它的
toString
方法在生成日期时间值的字符串表示形式时默默地应用JVM的当前默认时区

java.time Java8及更高版本附带了Java.time框架。与旧的java.util.Date/.Calendar相比有了巨大的改进

UTC 在中的时间线上,使用类。time有一个工厂方法,从UTC 1970年的第一个时刻开始计算毫秒数,这对于我们这里的目的很方便。但请注意,java.time类的基本分辨率要高得多,而不是毫秒

Instant negative = Instant.ofEpochMilli ( - 12345L );
Instant zero = Instant.ofEpochMilli ( 0L );
Instant positive = Instant.ofEpochMilli ( 12345L );
转储到控制台

System.out.println ( "negative: " + negative + "  zero: " + zero + "  positive: " + positive );
System.out.println ( "zdtNegative: " + zdtNegative + "  zdtZero: " + zdtZero + "  zdtPositive: " + zdtPositive );
负片:1969-12-31T23:59:47.655Z零点:1970-01-01T00:00:00Z正片:1970-01-01T00:00:12.345Z

在时区 我们可以使用这些
即时
对象中的任何一个,然后调整到。这就产生了一个对象

您的密码似乎是
-05:00
。所以我将任意地计算这个偏移量

ZoneId zoneId = ZoneId.of ( "America/Jamaica" );
ZonedDateTime zdtNegative = ZonedDateTime.ofInstant ( negative, zoneId );
ZonedDateTime zdtZero = ZonedDateTime.ofInstant ( zero, zoneId );
ZonedDateTime zdtPositive = ZonedDateTime.ofInstant ( positive, zoneId );
转储到控制台

System.out.println ( "negative: " + negative + "  zero: " + zero + "  positive: " + positive );
System.out.println ( "zdtNegative: " + zdtNegative + "  zdtZero: " + zdtZero + "  zdtPositive: " + zdtPositive );
zdtNegative:1969-12-31T18:59:47.655-05:00[美国/牙买加]zdtZero:1969-12-31T19:00-05:00[美国/牙买加]zdtPositive:1969-12-31T19:00:12.345-05:00[美国/牙买加]


其他答案是正确的,但已经过时。正如他们所提到的,java.util.Date的许多不好的特性之一是它的
toString
方法在生成日期时间值的字符串表示形式时默默地应用JVM的当前默认时区

java.time Java8及更高版本附带了Java.time框架。与旧的java.util.Date/.Calendar相比有了巨大的改进

UTC 在中的时间线上,使用类。time有一个工厂方法,从UTC 1970年的第一个时刻开始计算毫秒数,这对于我们这里的目的很方便。但请注意,java.time类的基本分辨率要高得多,而不是毫秒

Instant negative = Instant.ofEpochMilli ( - 12345L );
Instant zero = Instant.ofEpochMilli ( 0L );
Instant positive = Instant.ofEpochMilli ( 12345L );
转储到控制台

System.out.println ( "negative: " + negative + "  zero: " + zero + "  positive: " + positive );
System.out.println ( "zdtNegative: " + zdtNegative + "  zdtZero: " + zdtZero + "  zdtPositive: " + zdtPositive );
负片:1969-12-31T23:59:47.655Z零点:1970-01-01T00:00:00Z正片:1970-01-01T00:00:12.345Z

在时区 我们可以使用这些
即时
对象中的任何一个,然后调整到。这就产生了一个对象

您的密码似乎是
-05:00
。所以我将任意地计算这个偏移量

ZoneId zoneId = ZoneId.of ( "America/Jamaica" );
ZonedDateTime zdtNegative = ZonedDateTime.ofInstant ( negative, zoneId );
ZonedDateTime zdtZero = ZonedDateTime.ofInstant ( zero, zoneId );
ZonedDateTime zdtPositive = ZonedDateTime.ofInstant ( positive, zoneId );
转储到控制台

System.out.println ( "negative: " + negative + "  zero: " + zero + "  positive: " + positive );
System.out.println ( "zdtNegative: " + zdtNegative + "  zdtZero: " + zdtZero + "  zdtPositive: " + zdtPositive );
zdtNegative:1969-12-31T18:59:47.655-05:00[美国/牙买加]zdtZero:1969-12-31T19:00-05:00[美国/牙买加]zdtPositive:1969-12-31T19:00:12.345-05:00[美国/牙买加]


问题必须在您计算机的时区内(在您的pc中看起来像UTC-5)。更多信息:@LuiggiMendoza,你怎么知道他的计算机上默认的TZ是什么?@foampile检查OP代码的第二个测试:它将创建一个新的
日期,时间为0毫秒,打印出来的时间为
31/Dec/1969 19:00:00
。在那之后,得到OP的pc时区是一个基本的数学问题。很好的回答,@luigimendozan这个问题一定在你电脑的时区(在你的电脑里看起来像UTC-5)。更多信息:@LuiggiMendoza,你怎么知道他的计算机上默认的TZ是什么?@foampile检查OP代码的第二个测试:它将创建一个新的
日期,时间为0毫秒,打印出来的时间为
31/Dec/1969 19:00:00
。在那之后,得到OP的pc时区就需要基本的数学知识了