当前位置: 首页 > 知识库问答 >
问题:

将字符串转换为具有时区Java的适当日期

司寇祺
2023-03-14

我正在与它的时区约会,我想把它转换成另一个时区,例如。我的日期是“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

如果我出了问题,请了解我。

共有2个答案

艾国安
2023-03-14
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.dateCalendar、&SimpleDateFormat

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

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

使用符合JDBC4.2或更高版本的JDBC驱动程序,您可以直接与数据库交换java.time对象。不需要字符串或java.sql.*类。

从哪里获得java.time类?

  • Java SE 8,Java SE 9,及以后
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9添加了一些小功能和修补程序。
    • 大部分Java.time功能在threeten-backport中后端移植到Java 6和7。
    • java.time类的Android捆绑实现的更高版本。
    • 对于早期的Android,ThreeTenABP项目适应了ThreeTen-Backport(上面提到过)。查看如何使用ThreeTenabp…。

    ThreeTen-Extra项目使用额外的类扩展了java.time。这个项目是将来可能添加java.time的一个试验场。您可以在这里找到一些有用的类,例如intervalyearweekyearquard等等。

范麒
2023-03-14

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对象中记录时区。我该怎么做?