我正在与它的时区约会,我想把它转换成另一个时区,例如。我的日期是“3/15/2013 3:01:53 PM”,它位于时区“GMT-06:00”。我想在'GMT-05:00'时区转换这个。我有很多搜索,我不知道实际约会是如何运作。如何将时区应用到日期。我尝试过SimpleDateFormat、Calender和Offset。
DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss aaa XXX");
df.setTimeZone(TimeZone.getTimeZone("GMT"));
Date dt = null;
try {
dt = df.parse("3/15/2013 3:01:53 PM -06:00");
} catch (ParseException e) {
e.printStackTrace();
}
String newDateString = df.format(dt);
System.out.println(newDateString);
它返回输出03/15/2013 09:01:53 AM Z
。我猜应该是03/15/2013 09:01:53 PM Z
,因为时间在'GMT-06:00'时区,所以应该是HH+6才能得到GMT时间。我想要日期在“yyyy-mm-dd HH:mm:ss”格式,其中HH是在24小时。请帮助我的例子。提前道谢。
编辑:
我正在使用SimpleDateFormat将字符串转换为日期
DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss aaa");
Date dt = null;
try {
dt = df.parse("3/15/2013 3:01:53 PM");
} catch (ParseException e) {
e.printStackTrace();
}
现在,正如您所说,我指定日历我的日期在'GMT-06:00'时区,并设置我的日期,
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT-6"));
cal.setTime(dt);
现在,我告诉日历,我希望日期在'GMT'
cal.setTimeZone (TimeZone.getTimeZone("GMT"));
System.out.println(cal.getTime());
输出:
Fri Mar 15 03:01:53 CDT 2013
如果我出了问题,请了解我。
OffsetDateTime.parse(
"3/15/2013 3:01:53 PM -06:00" ,
DateTimeFormatter.ofPattern( "M/d/yyyy H:mm:ss a XXX" )
).withOffsetSameInstant(
ZoneOffset.of( -5 , 0 )
)
2013-03-15T15:01:53-06:00
Hochschild的答案是正确的,但使用了过时的类。与最早版本的Java捆绑在一起的麻烦的旧日期时间类已经被现代的Java.time类所取代。
将输入字符串解析为offsetdatetime
,因为它包含offset-from-UTC而不是时区。
String input = "3/15/2013 3:01:53 PM -06:00";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "M/d/yyyy h:mm:ss a XXX" );
OffsetDateTime odt = OffsetDateTime.parse( input , f );
ODT.ToString():2013-03-15t15:01:53-06:00
提示:当将日期-时间数据交换为文本时,可以省去一些麻烦,使用ISO 8601格式。java.time类在解析/生成字符串时默认使用这些标准格式。
显然,您希望看到的时刻与其他地方的人使用不同的偏移量-UTC所看到的时刻相同。
ZoneOffset offset = ZoneOffset.of( -5 , 0 ) ;
OffsetDateTime odt2 = odt.withOffsetSameInstant( offset ) ;
我们可以看到偏移量从6变化到5,而一天中的小时也相应地从15变化到16。相同的同时时刻,不同的挂钟时间。
ODT2.ToString():2013-03-15t16:01:53-05:00
我想要日期在“yyyy-mm-dd HH:mm:ss”格式,其中HH是在24小时。
我建议您总是包含一些偏移量或区域的指示,除非您绝对确定用户从更大的上下文中理解。
您的格式几乎是标准的ISO8601格式。您可以定义自己的格式模式,但我只需要执行字符串操作,用空格替换中间的t
。
String output = odt2.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME ).replace( "T" , " " ) ;
2013-03-15 16:01:53
Java.time框架内置在Java 8和更高版本中。这些类取代了麻烦的旧的遗留日期-时间类,如java.util.date
、Calendar
、&SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参阅Oracle教程。并搜索堆栈溢出以获得许多示例和解释。规范是JSR310。
使用符合JDBC4.2或更高版本的JDBC驱动程序,您可以直接与数据库交换java.time对象。不需要字符串或java.sql.*类。
从哪里获得java.time类?
ThreeTen-Extra项目使用额外的类扩展了java.time。这个项目是将来可能添加java.time的一个试验场。您可以在这里找到一些有用的类,例如interval
、yearweek
、yearquard
等等。
null
// h instead of H because of AM/PM-format
DateFormat parseFormat = new SimpleDateFormat("M/dd/yyyy hh:mm:ss aaa XXX");
Date dt = null;
try {
dt = parseFormat.parse("3/15/2013 3:01:53 PM -06:00");
}catch (ParseException e) {
e.printStackTrace();
}
DateFormat printFormat = new SimpleDateFormat("M/dd/yyyy hh:mm:ss aaa XXX");
printFormat.setTimeZone(TimeZone.getTimeZone("GMT-05"));
String newDateString = printFormat.format(dt);
System.out.println(newDateString);
产出:3/15/2013 04:01:53 PM-05:00
如果您想要hh:mm:ss(24小时格式),那么您只需替换
hh:mm:ss aaa
由
HH:mm:ss
在printformat-pattern中。
对问题其他方面的评论:
java.util.date
没有内部时区,并且总是按规范引用UTC。您不能在此对象中更改它。对于格式化字符串,时区转换是可能的,但如我的代码示例所示(您希望转换到区域GMT-05)。
然后问题切换到使用UTC时区(符号Z)以ISO格式打印date
-对象的新要求。这可以在格式化中完成,方法是将模式替换为“yyyy-mm-dd't'hh:mm:ssxxx”,并将printFormat的时区显式设置为GMT+00。您应该明确您真正想要的格式输出是什么。
关于java.util.gregorianCalendar
:在这里设置时区是以编程方式更改日历对象,因此它会影响诸如calendar.get(calendar.hour_of_day)
之类的方法调用。但是,这与格式化无关!
问题内容: 我的时区有日期,我想将其转换为另一个时区,例如我的日期为“ 2013年3月15日下午3:01:53 PM”,位于时区“ GMT-06:00”。我想在“ GMT-05:00”时区进行转换。我的搜索量很多,对日期的实际工作方式感到困惑。如何将时区应用于日期。我尝试使用SimpleDateFormat,日历和偏移量。 它返回输出 。我想应该是 ,因为时间是在’GMT-06:00’时区,所以在
问题内容: 我正在获取xml和rss提要,并将数据放入数据库中。到目前为止,我遇到了两种不同的日期格式… 和 我相信还会有更多。我的日期的postgresql数据库是没有时区的时间戳。php中是否存在现有函数,或者是否存在将任何日期字符串转换为不带时区的时间戳的程序(Ymd H:i:s)? 问题答案: 搭配使用: 结果: 。 结果:
在我的数据库中,我必须把一个日期时间以ISO格式与时区。例如,我有以下条目列: 我有一个web服务,它接受日期(在JSON对象中),如下所示: 现在,在我的javascript代码中,我尝试了: 谢谢
问题内容: 该java.util.Date 方法显示当地时区的日期。 在几种常见的情况下,我们希望以UTC格式打印数据,包括日志,数据导出以及与外部程序的通信。 在UTC中创建String表示形式的最佳方法是什么? 如何用更好的格式替换无法排序的juDate 格式(感谢@JonSkeet!)? 附录 我认为以自定义格式和时区打印日期的标准方法非常繁琐: 我一直在寻找像这样的单线: 问题答案: 遵循
问题内容: 我有一个带有字符串列( varchar(200) )的表,其中包含不同格式的日期。例如 我想将此日期转换为要提取年份的日期。我该怎么办?我使用了STR_TO_DATE,但效果不佳。我必须为每种不同的格式使用SUBSTRING吗? MySQL 5.0.95版 问题答案: 在手册页上有一个检测有效日期的技巧。您可以使用它来确定格式是否有效。 为您期望的所有人提供一种格式。测试像疯了似的。
我有一些日期格式的字符串,例如 我使用SimpleDateForate并尝试将String类型转换为Date类型。它将String类型转换为Date类型,但是Java无法识别时区“MYT”,而是将其设置为计算机的默认时区,即“CST”。我需要在Date对象中记录时区。我该怎么做?