Java Calendar.getInstance()更改Linux中的默认时区

时间:2016-09-28 16:42:17

标签: java datetime calendar simpledateformat

请参阅我的代码如下:

SimpleDateFormat sd = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);  
sd.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println(sd.format(calendar.getTime()));

我的Windows系统的默认时区是EDT,此时我运行此代码的时间是(28/09/2016 12:27 PM),当我在系统中运行此代码时,我得到的输出如下 - 意图(EDT到GMT转换):

28/09/2016 04:00:00   

但是当我在服务器(Red Hat Enterprise Linux Server版本5.11)上运行它时,我得到的输出如下:

28/09/2016 00:00:00

当我将以下命令运行到Linux shell

date +%Z

它返回低于输出

EDT

所以,我无法理解为什么转换没有发生。另外,我有一段代码如下:

SimpleDateFormat sd = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
Calendar calendar = Calendar.getInstance();
sd.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println(sd.format(calendar.getTime()));

在同一个Linux服务器中返回以下输出(在28/09/2016 12:36 PM运行),并将其转换为GMT的预期输出

28/09/2016 16:36:46   

此代码是在WebLogic 12c上运行的J2EE应用程序的一部分。如果您有任何线索,请分享可能导致上述情况的原因。感谢。

1 个答案:

答案 0 :(得分:0)

您依赖于默认时区。指定两个时区,转换应该有效。

28/09/2016 12:27:00 -> 28/09/2016 16:27:00 +0000

这是一些测试代码。

package com.ggl.testing;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

public class TimeZoneConversion {

    public static void main(String[] args) {
        SimpleDateFormat sdInput = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
        sdInput.setTimeZone(TimeZone.getTimeZone("US/Eastern"));
        SimpleDateFormat sdOutput = new SimpleDateFormat(
                "dd/MM/yyyy HH:mm:ss Z");
        sdOutput.setTimeZone(TimeZone.getTimeZone("GMT"));

        try {
            String dateString = "28/09/2016 12:27:00";
            Date inputDate = sdInput.parse(dateString);
            System.out
                    .println(dateString + " -> " + sdOutput.format(inputDate));
        } catch (ParseException e) {
            e.printStackTrace();
        }

    }

}