在Java中将历元秒转换为日期和时间格式

在Java中将历元秒转换为日期和时间格式,java,datetime-format,epoch,seconds,Java,Datetime Format,Epoch,Seconds,自1970年1月1日UTC(大纪元时间)以来,我有秒数 1320105600 我需要将秒转换成以下格式的日期和时间 Friday,November 4,2011 5:00,AM 11月4日星期五上午5:00 如何实现这一点?诀窍是使用java.util.Date和java.text.DateFormat来获得所需的格式。你可以在中查找如何做这件事 有关更多信息,请参见此。构造函数需要毫秒 要以适当的格式显示此日期,您应该选中 以下是一个例子: DateFormat df = new Simple

自1970年1月1日UTC(大纪元时间)以来,我有秒数

1320105600 我需要将秒转换成以下格式的日期和时间

Friday,November 4,2011 5:00,AM 11月4日星期五上午5:00
如何实现这一点?

诀窍是使用
java.util.Date
java.text.DateFormat
来获得所需的格式。你可以在中查找如何做这件事

有关更多信息,请参见此。构造函数需要毫秒

要以适当的格式显示此日期,您应该选中

以下是一个例子:

DateFormat df = new SimpleDateFormat("dd MMM yyyy hh:mm:ss zzz");
System.out.println(df.format(date));

如果您仅限于遗留
java.util.Date
java.util.Calendar
API,则需要考虑时间戳的解释单位是毫秒,而不是秒。因此,首先需要将其乘以1000,以毫秒为单位获得时间戳

long seconds = 1320105600;
long millis = seconds * 1000;
通过这种方式,您可以将其提供给的构造函数a.o.,并最终使用它将
java.util.Date
转换为所需的日期格式模式
java.lang.String
,如果需要,还可以使用预定义的时区(否则它将使用本身不是GMT/UTC的系统,因此格式化的时间可能会关闭)

如果您已经在使用Java8,那么有一个函数允许您直接输入epoch秒,而不需要乘以毫秒

LocalDateTime dateTime = LocalDateTime.ofEpochSecond(seconds, 0, ZoneOffset.UTC);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEEE,MMMM d,yyyy h:mm,a", Locale.ENGLISH);
String formattedDate = dateTime.format(formatter);
System.out.println(formattedDate); // Tuesday,November 1,2011 12:00,AM
java.time 它的好处在于,它指出您可以使用java.time。但这个答案使用了更合适的地方。A不是时间线上的一个时刻,因为它故意没有或的概念

java.time 该框架内置于Java8及更高版本中。这些类取代了旧的麻烦的日期时间类,如
java.util.date
.Calendar
,&
java.text.SimpleDateFormat
。该团队还建议迁移到java.time

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释

大部分java.time功能都在中向后移植到Java6和Java7,并在中进一步适应Android

Instant
时间线上分辨率高达的时刻由类表示

转储到控制台。您的输入值是中的2011年11月1日的第一个时刻。末尾的
Z
是“祖鲁”的缩写,表示UTC

System.out.println ( "instant: " + instant );
瞬间:2011-11-01T00:00:00Z

ZoneDateTime
在你的评论中,你提到希望通过时区的视角来看待这个日期和时间。使用一个。应用时区,
ZoneId
,以获取
zoneDateTime
对象。我们看到芝加哥在那一天比UTC晚了五个小时

ZoneId zoneId = ZoneId.of ( "America/Chicago" );
ZonedDateTime zdt = instant.atZone ( zoneId );
zdt:2011-10-31T19:00-05:00[美国/芝加哥]

串 上面看到的字符串是标准格式的。要生成其他格式的字符串,请使用类。您可以指定自己的自定义图案。但通常最好让java.time自动本地化为对象中编码的人类语言和文化规范

2011年10月31日星期一CDT下午7:00:00


要指定您自己的自定义格式,请在Stack Overflow中搜索许多示例和更多讨论。

一个想法是浏览javadocs-例如java.util.date请详细说明您得到的结果和您期望的结果。我无法直接亲自向您反映问题所在。我至少可以说,发布的代码对我来说运行良好,并且我得到了最后一行评论中所示的结果。实际上,我在发布问题时犯了一个错误。我正在与美国芝加哥计时公司合作。我的秒数是1320105600。这个问题的正确结果是2011年11月1日星期二上午7:00,但我得到的是星期一,2011年10月31日下午7:00,使用上述代码。我知道存在时区差异,但12小时?我再次验证了芝加哥时间(CST,GMT-6)。您的比较材料可能是错误的或被误解的。可能未正确解释AM/PM标记或24小时时间信息。确切的12小时差异也是一个太大的巧合。请注意,你在电脑上得到的答案也证实了这一点。使用
CST
作为时区和
calendar.set(2011年,calendar.10月31日,19日,0日)进行尝试。您将得到准确的
1320105600
。您或您的同事似乎仍然不了解时区的影响:这也证实了您的比较材料是错误的。我将编辑答案以包含UTC时区。
LocalDateTime dateTime = LocalDateTime.ofEpochSecond(seconds, 0, ZoneOffset.UTC);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEEE,MMMM d,yyyy h:mm,a", Locale.ENGLISH);
String formattedDate = dateTime.format(formatter);
System.out.println(formattedDate); // Tuesday,November 1,2011 12:00,AM
int seconds = 1320105600;
Date date = new Date(seconds * 1000);
SimpleDateFormat sdf = new SimpleDateFormat("EEEE,MMMM d,yyyy h:mm,a");
System.out.println(sdf.format(date));
Instant instant = Instant.ofEpochSecond ( 1_320_105_600L );
System.out.println ( "instant: " + instant );
ZoneId zoneId = ZoneId.of ( "America/Chicago" );
ZonedDateTime zdt = instant.atZone ( zoneId );
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime ( FormatStyle.FULL );
formatter = formatter.withLocale ( Locale.US );
String output = zdt.format ( formatter );