Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java转换时区_Java_Date_Timezone - Fatal编程技术网

Java转换时区

Java转换时区,java,date,timezone,Java,Date,Timezone,我见过几个这样的问题,但我不能完全正确地转换。我想转换一个日期,如下所示 2012111603036Z 到 2012-11-16 15:30:36 我有以下代码 dateStringTime.set( year, mon-1 , day, hour, minute, second ); Date date = dateStringTime.getTime(); DateFormat formatter = new SimpleDateFormat("yyyy-MM-d

我见过几个这样的问题,但我不能完全正确地转换。我想转换一个日期,如下所示

2012111603036Z

2012-11-16 15:30:36

我有以下代码

    dateStringTime.set( year, mon-1 , day, hour, minute, second );

    Date date = dateStringTime.getTime();

    DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    formatter.setTimeZone(TimeZone.getTimeZone("EST"));

    String output = formatter.format();
    return output;
这是可行的,但它给了我以下的信息

2012-11-16 20:30:36

关于如何获得15而不是20的建议?

时区。将给出运行时时区。 如果您将从
日期
中删除该值,您将获得UTC。
还有一个步骤是从UTC添加/删除EST值,并完成转换。首先,您的代码没有格式化“日期”,请尝试以下操作:

  String output = formatter.format(date);
我还注意到,您没有向我们展示如何创建
dateStringTime
,我假设它是
日历
。我注意到,
Calendar.getInstance()
方法也接受可能影响时区的
Locale

我的代码:

    Calendar dateStringTime = Calendar.getInstance();

    //convert 20121116203036Z       
    int year = 2012;
    int mon = 11;
    int day = 16;
    int hour = 20;
    int minute = 30;
    int second = 36;

    dateStringTime.set( year, mon-1 , day, hour, minute, second );

    Date date = dateStringTime.getTime();

    DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    formatter.setTimeZone(TimeZone.getTimeZone("EST"));

    String output = formatter.format(date);
    System.out.println(output);     
我的输出:

2012-11-16 21:30:36
你注意到休息一小时了吗?这是因为我在中央时区,JVM在我请求“EST”时考虑到了这一点。它认为原始时间在当前时区中

当你发表评论时会发生什么

        //formatter.setTimeZone(TimeZone.getTimeZone("EST"));

你的问题是你输入的日期在错误的时区。当你这么做的时候

dateStringTime.set(year, month-1 , day, hour, minute, second);
您实际上是使用默认时区输入日期,在您的情况下,默认时区不太可能是UTC。在封面下,Java
Date
表示为UTC,因此它将日期/时间转换为UTC,而不是直接输入UTC

基本上,它执行以下时区转换顺序:EST->UTC->EST

如果要使用UTC指定日期/时间,应执行以下操作:

dateStringTime.setTimeZone(TimeZone.getTimeZone("UTC"));
dateStringTime.set(year, month-1 , day, hour, minute, second);
然后,您将只从UTC->EST开始,并应获得正确的输出。

tl;博士 java.time java中内置的java.time类使这变得简单。避免麻烦的旧日期时间类,例如
date
DateFormat
,现在是遗留的

String input = "20121116203036Z";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "yyyyMMddHHmmssX" );
OffsetDateTime odt = OffsetDateTime.parse( input , f );
odt.toString():2012-11-16T20:30:36Z

要获得输出,可以定义自定义的
DateTimeFormatter
。一种更懒惰的方法是转换为A,以便在末尾丢失
Z
,这表示与UTC的偏移量(
Z
Zulu
的缩写,表示UTC)。然后使用<代码> toString 生成一个ISO 8601格式的字符串,除了在中间用一个空格替换<代码> t>代码>
String output = odt.toLocalDateTime().toString().replace( "T" , " " );
2012-11-16 20:30:36

ISO 8601 我建议不要对这些日期时间值使用您的格式,而是使用标准格式。该值的通常格式为
2016-11-16T02:45:02Z
。请注意,在年中的一个月,从一分秒到第二分钟。或者,该标准允许最小化分隔符的使用,被认为是“基本”版本:<代码> 20161116T024502Z ,但是在中间保留了<代码> t <代码>。 time类可以解析和生成扩展版本,但不能生成基本版本


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到java.time

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释

大部分java.time功能都在中向后移植到java 6和7,并进一步适应于中(请参阅)


该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,例如、、和。

当我这样做时,我得到。。。2012-11-17 01:30:36提示:“convert 201211162036Z”后面的代码没有这样做。请避免手动进行时间计算,特别是当实际上有一个简单的解决方案不涉及这样做时。
String output = odt.toLocalDateTime().toString().replace( "T" , " " );