Java中的日期/时区问题

时间:2014-02-17 13:33:56

标签: java java-ee datetime timezone timezone-offset

我需要在我的java应用程序中显示CET中的时区。 我正在使用以下代码来实现这一目标。

String OLD_FORMAT = "yyyyMMdd HH:mm:ss";
String NEW_FORMAT = "dd.MM.yyyy HH:mm:ss";
String date = "20140217 14:45:28";

SimpleDateFormat sdf = new SimpleDateFormat(OLD_FORMAT);

TimeZone zone = TimeZone.getTimeZone("GMT+1");
sdf.setTimeZone(zone);

Date d = null;
d = sdf.parse(date);
sdf.applyPattern(NEW_FORMAT);
date = sdf.format(d);

我正在使用日期对象在UI上打印日期。

OR

    TimeZone zone = TimeZone.getTimeZone("CET");
    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd HH:mm:ss");
    sdf.setTimeZone(zone);

但是使用上面这两段代码中的任何一个,我都得到GMT时间,这比CET要晚一个小时。

例如,如果我现在执行代码,我将 1:32:50 PM ,其中 2:32:50 PM 根据http://wwp.greenwichmeantime.com/time-zone/europe/european-union/central-european-time/

任何人都知道这里可能出现什么问题?

更新:我发现了这个问题。我犯了一个愚蠢的错误,因为我必须先将时间设置为GMT(我得到的日期时间是GMT),然后将其更改为CET。它现在正在工作。非常感谢大家的回复。

5 个答案:

答案 0 :(得分:0)

也许您将错误的日期传递给SimpleDateFormat实例。我写了一个小的来测试你的代码,它似乎工作:

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.TimeZone;

    public class Test {
        public static void main(String[] args) {
            TimeZone zone = TimeZone.getTimeZone("GMT+1");
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd HH:mm:ss");
            sdf.setTimeZone(zone);

            TimeZone zone2 = TimeZone.getTimeZone("CET");
            SimpleDateFormat sdf2 = new SimpleDateFormat("yyyyMMdd HH:mm:ss");
            sdf2.setTimeZone(zone2);

            Calendar c = Calendar.getInstance();
            c.set(Calendar.HOUR_OF_DAY, 15);
            c.set(Calendar.MINUTE, 0);
            c.set(Calendar.SECOND, 0);
            c.setTimeZone(TimeZone.getTimeZone("GMT+3"));

            System.out.println(sdf.format(c.getTime()));
            System.out.println(sdf2.format(c.getTime()));

        }
    }

答案 1 :(得分:0)

java.util.Date没有TimeZone,它基本上是一个很长的(自纪元以来毫秒)。如果您想保留时区,则必须使用java.util.Calendar甚至更好,使用joda-time

答案 2 :(得分:0)

第二段代码应该可以解决问题。

请注意,java中的CET实际上意味着冬季的CET和夏季的CEST,这是您想要的。 GMT + 1实际上不会切换到夏令时,所以如果你使用它,你会被困在冬天。

如果输出值仍然错误,则表示格式错误。

在解析日期时,您可能会犯同样的时区错误吗?

答案 3 :(得分:0)

避免使用3个字母代码

这三个字母的时区代码既不标准也不唯一。他们对夏令时(DST)感到困惑。而是使用适当的time zone names

+01:00有几十个这样的名字。选择代表DST和其他异常的适用规则的那个。我的示例代码任意选择巴黎时区。

令人困惑的问题

我无法理解您的输入字符串是代表UTC的日期时间还是已经是+01:00时区。我的示例代码有两种变体,涵盖两种情况。

此外,如果您搜索过,您会在StackOverflow上找到问题并多次回答。

约达时间

捆绑的java.util.Date和Calendar类非常麻烦。避免他们。使用:

示例代码

String input = "20140217 14:45:28";

// Formatters
DateTimeFormatter formatterInput = DateTimeFormat.forPattern( "yyyyMMdd HH:mm:ss" );
DateTimeFormatter formatterOutput = DateTimeFormat.forPattern( "dd.MM.yyyy HH:mm:ss" );

// Use a proper time zone name rather than 3-letter codes.
DateTimeZone timeZoneParis = DateTimeZone.forID( "Europe/Paris" );

// If that input was meant to be in UTC, and then adjusted to +01:00.
DateTime dateTimeAsUtc = formatterInput.withZone( DateTimeZone.UTC ).parseDateTime( input );
DateTime dateTimeAdjustedToParis = dateTimeAsUtc.withZone( timeZoneParis );

// Or, if that input was already in +01:00.
DateTime dateTimeAsParis = formatterInput.withZone( timeZoneParis ).parseDateTime( input );

转储到控制台...

System.out.println( "input: " + input );
System.out.println( "dateTimeAsUtc: " + dateTimeAsUtc );
System.out.println( "dateTimeAdjustedToParis: " + dateTimeAdjustedToParis );
System.out.println( "dateTimeAdjustedToParis thru formatter: " + formatterOutput.print( dateTimeAdjustedToParis ) );
System.out.println( "dateTimeAsParis: " + dateTimeAsParis );

跑步时......

input: 20140217 14:45:28
dateTimeAsUtc: 2014-02-17T14:45:28.000Z
dateTimeAdjustedToParis: 2014-02-17T15:45:28.000+01:00
dateTimeAdjustedToParis thru formatter: 17.02.2014 15:45:28
dateTimeAsParis: 2014-02-17T14:45:28.000+01:00

答案 4 :(得分:-1)

我使用以下代码来获取我的国家/地区的日期和时间;

String TIME_SERVER = "time-a.nist.gov";   
NTPUDPClient timeClient = new NTPUDPClient();
InetAddress inetAddress = InetAddress.getByName(TIME_SERVER);
TimeInfo timeInfo = timeClient.getTime(inetAddress);
long returnTime = timeInfo.getMessage().getTransmitTimeStamp().getTime();
Date time = new Date(returnTime);

也许它可以帮助你,如果它没有,只需发表评论,我将删除我的答案。