Java SimpleDateFormat Pattern for JavaScript Date

Java SimpleDateFormat Pattern for JavaScript Date

本文关键字:JavaScript Date for Pattern SimpleDateFormat Java      更新时间:2023-09-26

我需要将Java Date对象转换为与JavaScript Dates转换为字符串时格式相同的字符串。在我们的服务器上,我们有 JavaScript 日期.toString(),格式如下:

Wed Mar 30 2016 00:00:00 GMT-0400 (EDT)

我有一个Java Date对象,我正在尝试将其转换为相同格式的字符串。到目前为止,我的SimpleDateFormat模式是

EEE MMM dd yyyy '00:00:00'(小时,分钟和秒将始终为0),但我无法找出时区的正确模式(GMT-0400 (EDT)

感谢您的帮助!这是我到目前为止使用的 Java 代码,以防它有所帮助:

SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd yyyy '00:00:00'");
Date date = arrayOfDates[i];
String dateStr = format.format(date);
// Current dateStr = "Wed Mar 30 2016 00:00:00"

编辑

Vaibhav Jain的回答让我走上了正确的轨道(Java SimpleDateFormat Pattern for JavaScript Date)

我最终使用的最终格式是:

EEE MMM dd yyyy '00:00:00' 'GMT'Z '('z')'

再次感谢大家!

SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd yyyy '00:00:00'  zZ");
Date date = arrayOfDates[i];
String dateStr = format.format(date);

tl;dr

解析字符串。

ZonedDateTime.parse ( 
    "Wed Mar 30 2016 00:00:00 GMT-0400 (EDT)" , 
    DateTimeFormatter.ofPattern ( "EEE MMM dd uuuu HH:mm:ss 'GMT'Z (z)" ).withLocale ( Locale.US ) 
)

生成字符串。

myJavaUtilDate.toInstant()
              .atZone( ZoneId.of( "America/New_York" ) )
              .format( 
                  DateTimeFormatter.ofPattern ( "EEE MMM dd uuuu HH:mm:ss 'GMT'Z (z)" )
                                   .withLocale ( Locale.US ) 
              )

java.time

您正在使用麻烦的旧日期时间类,现在是遗留的,被java.time类所取代。

解析字符串

使用类定义格式DateTimeFormatter模式。

现代模式代码与传统SimpleDateFormat代码类似,但不完全相同。研究文档。区域/偏移模式代码的微妙之处让我无法理解,但一些反复试验发现了一种似乎有效的组合。彻底测试,因为我没有;使用风险自负。

String input = "Wed Mar 30 2016 00:00:00 GMT-0400 (EDT)"; // EDT
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "EEE MMM dd uuuu HH:mm:ss 'GMT'x (z)" ).withLocale ( Locale.US );
ZonedDateTime zdt = ZonedDateTime.parse ( input , f );

生成标准 ISO 8601 格式的字符串。

System.out.println ( "zdt.toString(): " + zdt );

zdt.toString(): 2016-03-30T00:00-04:00[美国/New_York]

顺便说一下,如果可能的话,我建议您使用标准的ISO 8601格式,而不是问题中显示的格式。更容易解析,也更容易被不同文化的人类阅读。

continent/region 的格式指定正确的时区名称,例如 America/MontrealAfrica/CasablancaPacific/Auckland切勿使用 3-4 个字母的缩写,例如 ESTEDTIST,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!

生成字符串

将任何java.util.Date转换为现代等效项 Instant .Instant 类以 UTC 表示时间轴上的时刻,分辨率为纳秒(最多九 (9) 位小数)。

若要转换,请查看添加到旧类中的新方法。

Instant instant = myJavaUtilDate.toInstant() ;

调整到所需的时区。

ZoneId z = ZoneId.of( "America/New_York" );
ZonedDateTime zdt = instant.atZone( z );

使用上面看到的相同DateTimeFormatter对象生成字符串。

DateTimeFormatter f = DateTimeFormatter.ofPattern ( "EEE MMM dd uuuu HH:mm:ss 'GMT'x (z)" ).withLocale ( Locale.US );
String output = zdt.format( f );

实时代码

在 IdeOne.com 中实时查看此示例代码。

String input = "Wed Mar 30 2016 00:00:00 GMT-0400 (EDT)"; // EDT
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "EEE MMM dd uuuu HH:mm:ss 'GMT'Z (z)" ).withLocale ( Locale.US );
ZonedDateTime zdt = ZonedDateTime.parse ( input , f );
String output = zdt.format ( f );
System.out.println ( "input: " + input );
System.out.println ( "zdt.toString(): " + zdt );
System.out.println ( "output: " + output );
System.out.println ( "input equals output: " + input.equals ( output ) );

输入时间:2016 年 3 月 30 日星期三 00:00:00 GMT-0400 (EDT)

zdt.toString(): 2016-03-30T00:00-04:00[美国/New_York]

输出:2016 年 3 月 30 日星期三 00:00:00 GMT-0400 (EDT)

输入等于输出:真


关于 java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧旧日期时间类,如java.util.DateCalendarSimpleDateFormat

Joda-Time 项目现在处于维护模式,建议迁移到 java.time 类。

要了解更多信息,请参阅 Oracle 教程。并搜索堆栈溢出以获取许多示例和解释。规范为 JSR 310。

从哪里获得java.time类?

  • Java SE 8SE 9 及更高版本
    • 内置。
    • 具有捆绑实现的标准 Java API 的一部分。
    • Java 9添加了一些小功能和修复。
  • Java SE 6SE 7
    • 许多java.time功能在ThreeTen-Backport中向后移植到Java 6和7。
  • 人造人
    • ThreeTenABP项目专门为Android改编了ThreeTen-Backport(如上所述)。
    • 请参阅如何使用ThreeTenABP...

ThreeTen-Extra项目通过额外的类扩展了java.time。这个项目是未来可能添加到java.time的试验场。你可以在这里找到一些有用的类,如IntervalYearWeekYearQuarter等。

要完全按照这样格式化日期,我们可能需要分别格式化日期和时区,例如,例如:

SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd yyyy hh:mm:ss");
Date date = new Date();
String dateStr = format.format(date);
TimeZone tz = TimeZone.getDefault();
int offset = tz.getRawOffset();
String text = String.format("%s%02d%02d", offset >= 0 ? "+" : "-", offset / 3600000, (offset / 60000) % 60);
String timeZoneText = "GMT" + text + " (" + tz.getDisplayName(true, tz.SHORT, Locale.getDefault())+")";
System.out.println(dateStr + " " + timeZoneText);

通常,如果给定日期有效,则创建的日期对象应返回相同的日期、月份和年份值。下面的逻辑适用于我编码的大多数情况。

示例:29-Feb-2018 不存在,但是当 javascript 接受此输入作为 Date("2018-02-29") 时,它会创建一个日期值 1-Mar-2018。

Javascript 函数:

   函数日期检查(日,月,年)    {      var tempDt = new Date(parseInt(yyyy), parseInt(mm)-1, parseInt(dd), 0, 0, 0, 0);      if(tempDt.getDate()!=parseInt(dd) ||        tempDt.getFullYear()!=parseInt(yyyy) ||        tempDt.getMonth() + 1 !=parseInt(mm))        返回假;      还        返回真;    }