我需要在我的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。它现在正在工作。非常感谢大家的回复。
答案 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)
这三个字母的时区代码既不标准也不唯一。他们对夏令时(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);
也许它可以帮助你,如果它没有,只需发表评论,我将删除我的答案。