Java SimpleDateFormat Pattern for JavaScript Date
Java SimpleDateFormat Pattern for JavaScript Date
我需要将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/Montreal
、 Africa/Casablanca
或 Pacific/Auckland
。切勿使用 3-4 个字母的缩写,例如 EST
或 EDT
或 IST
,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!
生成字符串
将任何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.Date
、Calendar
和SimpleDateFormat
。
Joda-Time 项目现在处于维护模式,建议迁移到 java.time 类。
要了解更多信息,请参阅 Oracle 教程。并搜索堆栈溢出以获取许多示例和解释。规范为 JSR 310。
从哪里获得java.time类?
- Java SE 8 和 SE 9 及更高版本
- 内置。
- 具有捆绑实现的标准 Java API 的一部分。
- Java 9添加了一些小功能和修复。
- Java SE 6 和 SE 7
- 许多java.time功能在ThreeTen-Backport中向后移植到Java 6和7。
- 人造人
- ThreeTenABP项目专门为Android改编了ThreeTen-Backport(如上所述)。
- 请参阅如何使用ThreeTenABP...。
ThreeTen-Extra项目通过额外的类扩展了java.time。这个项目是未来可能添加到java.time的试验场。你可以在这里找到一些有用的类,如Interval
、YearWeek
、YearQuarter
等。
要完全按照这样格式化日期,我们可能需要分别格式化日期和时区,例如,例如:
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)) 返回假; 还 返回真; }
- Javascript Date.toString() formatting?
- Javascript Date 对象因格式而异:yyyy-mm-dd vs mm-dd-yyyy
- JavaScript:Date 的 toString() 和 toLocaleString() 方法之间的区别
- Javascript Date - 只设置日期,忽略时间
- Javascript Date() object with NULL Time
- Javascript Date对象到日期字符串
- Javascript Date():如何将本地日期转换为GMT
- 传递日期和日期时间之间的Javascript Date()差异
- Javascript Date MAX_VALUE
- Javascript: Date().toJSON() 更改日期.
- Javascript Date.toJSON don't获取时区偏移量
- 使用Mysql UNIX_TIMESTAMP()与JAVASCRIPT Date.UTC()获得不同的结果
- 闰年的计算似乎与JavaScript Date不匹配
- 在 Node.js 中向 javascript Date 添加分钟数
- Javascript date picker asp.net mvc
- 将数组传递给Javascript Date构造函数,是标准的吗?
- highcharts:将useUTC=true milliseconds转换为javascript Date对象
- Javascript Date 中的日期无效
- Javascript Date() 有时会返回错误的值
- 将 JavaScript Date 对象格式化为特定格式