[英]Date TimeZone conversion in java?
我一直在尋找將日期從格林尼治標准時間轉換為本地時間的最簡單方法。 當然,要考慮適當的夏令時日期並盡可能地采用標准日期。
我能想到的最直接的代碼是:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String inpt = "2011-23-03 16:40:44";
Date inptdate = null;
try {
inptdate = sdf.parse(inpt);
} catch (ParseException e) {e.printStackTrace();}
Calendar tgmt = new GregorianCalendar(TimeZone.getTimeZone("GMT"));
tgmt.setTime(inptdate);
Calendar tmad = new GregorianCalendar(TimeZone.getTimeZone("Europe/Madrid"));
tmad.setTime(inptdate);
System.out.println("GMT:\t\t" + sdf.format(tgmt.getTime()));
System.out.println("Europe/Madrid:\t" + sdf.format(tmad.getTime()));
但是我認為對於getTime
將返回的內容我沒有正確的概念。
這里的問題是DateFormat類具有時區。 請嘗試以下示例:
SimpleDateFormat sdfgmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sdfgmt.setTimeZone(TimeZone.getTimeZone("GMT"));
SimpleDateFormat sdfmad = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sdfmad.setTimeZone(TimeZone.getTimeZone("Europe/Madrid"));
String inpt = "2011-23-03 16:40:44";
Date inptdate = null;
try {
inptdate = sdfgmt.parse(inpt);
} catch (ParseException e) {e.printStackTrace();}
System.out.println("GMT:\t\t" + sdfgmt.format(inptdate));
System.out.println("Europe/Madrid:\t" + sdfmad.format(inptdate));
這是2017年的答案。
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String inpt = "2011-03-23 16:40:44";
ZonedDateTime madridTime = LocalDateTime.parse(inpt, dtf)
.atOffset(ZoneOffset.UTC)
.atZoneSameInstant(ZoneId.of("Europe/Madrid"));
System.out.println("GMT:\t\t" + inpt);
System.out.println("Europe/Madrid:\t" + madridTime.format(dtf));
請盡情享受這段代碼表達意圖的自然程度。
代碼打印
GMT: 2011-03-23 16:40:44
Europe/Madrid: 2011-03-23 17:40:44
(選項卡的大小為8,可以很好地對齊,但是StackOverflow似乎應用了選項卡的大小為4)。
我在您的輸入字符串中交換了23
和03
,我相信您打算這樣做。 順便說一句,不是我發現您的錯誤,是因為LocalDateTime.parse()
拋出異常,因為沒有第23個月。 在這方面,現代班級也比過時的班級更有幫助。
喬達時間? Basil Bourque的答案提到並推薦了我正在使用的java.time
和Joda-Time。 盡管Joda-Time已經比問題中使用的過時類( SimpleDateFormat
, Calendar
, GregorianCalendar
)有了很大的改進,但目前它處於維護模式; 預計不會有更大的發展。 java.time
受到Joda-Time的極大啟發。 對於新代碼,我認為沒有理由不java.time
您使用java.time
。
最簡單的方法是使用適當的日期時間庫,而不是使用麻煩的java.util.Date和.Calendar類。 而是使用Java 8中的Joda-Time或java.time包。
String input = input.replace( " ", "T" ).concat( "Z" ) ; // proper ISO 8601 format for a date-time in UTC.
DateTimeZone timeZone = DateTimeZone.forID( "Europe/Madrid" );
DateTime dateTime = new DateTime( input, timeZone );
String output = dateTime.toString();
您需要使用DateFormat.setTimeZone()
在SimpleDateFormat
上設置TimeZone
。
對於輸入,您只需將時區添加到字符串中(請注意格式中的“ z”):
new SimpleDateFormat ("yyyy-MM-dd HH:mm:ss z").parse ("2011-23-03 16:40:44 GMT");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.