Java Java脚本日期的 SimpleDateFormat 模式

Java SimpleDateFormat Pattern for JavaScript Date

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

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

我有一个 Java 日期对象,我正试图将其转换为相同格式的字符串。到目前为止,我的 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 的回答让我走上正轨 ()

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

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);

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

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);

tl;博士

正在解析字符串。

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

您使用的是麻烦的旧 date-time classes,现在已被 java.time classes 取代。

正在解析字符串

使用 DateTimeFormatter class.

定义格式模式

现代模式代码与遗留 SimpleDateFormat 代码相似,但不完全相同。研究文档。 zone/offset 模式代码的微妙之处让我难以理解,但一些 trial-and-error 发现了一个似乎有效的组合。彻底测试,因为我没有;使用风险自负。

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[America/New_York]

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

指定 proper time zone name in the format of continent/region, such as America/Montreal, Africa/CasablancaPacific/Auckland切勿使用 3-4 个字母的缩写,例如 ESTEDTIST,因为它们 不是 真正的时区,不是标准化的,甚至不是唯一的(!)。

生成字符串

将任何 java.util.Date 转换为现代等效项 InstantInstant class represents a moment on the timeline in UTC with a resolution of nanoseconds(最多九 (9) 位小数)。

要转​​换,请查看添加到旧 classes 的新方法。

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 );

实时代码

查看此示例 code live in 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 ) );

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

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

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

input equals output: true


关于java.time

java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

Joda-Time project, now in maintenance mode, advises migration to the java.time classes.

要了解更多信息,请参阅 Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310

从哪里获得java.time classes?

  • Java SE 8 and SE 9 及更高版本
    • Built-in。
    • 标准 Java API 的一部分,带有捆绑实施。
    • Java 9 添加了一些小功能和修复。
  • Java SE 6 and SE 7
    • java.time 的大部分功能是 back-ported 到 Java ThreeTen-Backport 中的 6 和 7。
  • Android
    • ThreeTenABP项目专门为Android改编ThreeTen-Backport(上面提到的)。
    • 参见

ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as Interval, YearWeek, YearQuarter, and more.

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

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

Javascript 函数:

    function dateCheck(dd,mm,yyyy)
    {
      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))
        return false;
      else
        return true;
    }