Java TimeZone转换

问题描述 投票:0回答:4

我知道Java日期是无时区的,尝试在Java日历上设置不同的时区不会将日期转换为适当的时区。所以我尝试了以下代码

 public static String DATE_FORMAT="dd MMM yyyy hh:mm:ss";
 public static String CURRENT_DATE_STRING ="31 October 2011 14:19:56 GMT";
 DateFormat dateFormat =  new SimpleDateFormat(DATE_FORMAT);
 dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
 System.out.println(dateFormat.parseObject(CURRENT_DATE_STRING));

但是在必须为Mon Oct 31 16:19:56的情况下输出错误的日期12:19:56

java timezone utc date-format simpledateformat
4个回答
2
投票

这里的主要问题是您的日期格式字符串使用的是hh(12小时制)而不是HH(24小时制)

第二,您的日期格式应指定您的日期字符串包含时区。(或者,您可以取消注释行,以告诉它正确的时区)。

第三,您应该使用DateFormat来输出屏幕显示时间以及...

最后,UTC = GMT,所以UTC时间也是14:19:56

((格林尼治标准时间,“英国冬季时间”与UTC相同,而BST提前一小时)

public class DateFormatTest {
    public static String DATE_FORMAT="dd MMM yyyy HH:mm:ss z";
     public static String CURRENT_DATE_STRING ="31 October 2011 14:19:56 GMT";

    public static void main(String[] args) throws ParseException {
         DateFormat dateFormat =  new SimpleDateFormat(DATE_FORMAT);
         //dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
         Date d= dateFormat.parse(CURRENT_DATE_STRING);
         dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
         System.out.println(dateFormat.format(d));
    }
}

输出:31 Oct 2011 14:19:56 UTC

HTH


1
投票

使用Joda Time。许多StackOverflow用户都推荐使用此方法,并且在时区转换示例中对此进行了详细记录。

祝你好运!


0
投票

整个输出是什么? Date.toString()应该打印时区。也许在您的情况下不在UTC中。


0
投票

java.time

我了解Java日期是无时区的

实际上,java.util.Date代表以UTC表示的时刻,零小时-分钟-秒的偏移量。

[提防Date::toString。可怕的toString方法会在生成文本时动态应用JVM当前的默认时区。这会造成该时区已经成为对象一部分的错觉。永远不要使用此类的许多原因之一。

尝试在Java日历上设置其他时区不会将日期转换为合适的时区

您应该使用现代的java.time类,而不要使用Calendar。具体来说,使用ZonedDateTime代表某个特定区域(时区)的人们所使用的挂钟时间所看到的时刻。

“ 2011年10月31日格林威治标准时间14:19:56”;

您输入的"31 October 2011 14:19:56 GMT"与您的格式化格式"dd MMM yyyy hh:mm:ss"不匹配。该模式无法解决您输入的偏移量,偏移量为零小时-分钟-秒,最后由GMT表示。

首先,请勿使用此类格式交换日期时间值。学习使用ISO 8601标准格式交换日期时间值作为文本。 java.time类在解析/生成文本时默认情况下方便地使用这些标准格式,因此根本不需要指定模式。

但是,如果您必须解析您的特定输入字符串,请定义一个匹配的格式化模式。

String input = "31 October 2011 14:19:56 GMT";
Locale locale = Locale.US;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd MMMM uuuu HH:mm:ss z" , locale );
ZonedDateTime zdt = ZonedDateTime.parse( input , f );

注意我们如何指定Locale,以确定在翻译您的输入内容时所使用的人类语言和文化规范。

显然,您想查看一下在东欧时区看到的这一刻。我将在该区域中任意选择一个时区。

ZoneId zoneHelsinki = ZoneId.of( "Europe/Helsinki" );
ZonedDateTime zdtHelsinki = zdt.withZoneSameInstant( zoneHelsinki );

转储到控制台。

System.out.println( "zdt = " + zdt );
System.out.println( "zdtHelsinki = " + zdtHelsinki );

zdt = 2011-10-31T14:19:56Z [GMT]

zdtHelsinki = 2011-10-31T16:19:56 + 02:00 [欧洲/赫尔辛基]

注意小时是如何从14更改为16的,因为那时芬兰的时钟比UTC早两个小时。


关于java.time

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

要了解更多信息,请参见Calendar。并在Stack Overflow中搜索许多示例和说明。规格为SimpleDateFormat

SimpleDateFormat项目现在位于Oracle Tutorial中,建议迁移到JSR 310类。

您可以直接与数据库交换java.time对象。使用兼容Joda-Time或更高版本的maintenance mode。不需要字符串,不需要java.time类。

从哪里获取java.time类?

ThreeTenABP项目使用其他类扩展了java.time。该项目是将来可能向java.time添加内容的试验场。您可能会在这里找到一些有用的类,例如ThreeTen-BackportHow to use ThreeTenABP…ThreeTen-ExtraInterval
© www.soinside.com 2019 - 2024. All rights reserved.