2014-01-25 25 views
0

我想使用Java中的SimpleDateFormat类将日期从一个时区转换为其他时区。 但不知怎的,它产生了不同的结果,假设它们在相同的TimeZone中。将日期从一个时区转换为java中的其他时区

这里是一个测试用例,它产生一个结果为IST,另一个结果为GMT。我认为它应该只产生两种情况下的GMT。

public class TestOneCoreJava { 

    public static void main(String[] args) throws ParseException {// Asia/Calcutta 
     DateFormat formatter = new SimpleDateFormat("dd-MMM-yy hh:mm:ss a"); 
     System.out.println(getDateStringToShow(formatter.parse("26-Nov-10 03:31:20 PM +0530"),"Asia/Calcutta", "Europe/Dublin", false)); 
     System.out.println(getDateStringToShow(formatter.parse("02-Oct-10 10:00:00 AM +0530"),"Asia/Calcutta", "Europe/Dublin", false)); 
     //------Output-- 
     //26-Nov-10 GMT 
     //02-Oct-10 IST 
    } 

    public static String getDateStringToShow(Date date, 
      String sourceTimeZoneId, String targetTimeZoneId, boolean includeTime) { 
     String result = null; 

     // System.out.println("CHANGING TIMEZONE:1 "+UnitedLexConstants.SIMPLE_FORMAT.format(date)); 
     String date1 = new SimpleDateFormat("dd-MMM-yy hh:mm:ss a").format(date); 

     SimpleDateFormat sourceTimeZoneFormat = new SimpleDateFormat("Z"); 
     sourceTimeZoneFormat.setTimeZone(TimeZone.getTimeZone(sourceTimeZoneId)); 

     date1 += " " + sourceTimeZoneFormat.format(date); 

     // Changed from 'Z' to 'z' to show IST etc, in place of +5:30 etc. 
     SimpleDateFormat targetTimeZoneFormat = new SimpleDateFormat("dd-MMM-yy hh:mm:ss a z"); 
     targetTimeZoneFormat.setTimeZone(TimeZone.getTimeZone(targetTimeZoneId)); 

     SimpleDateFormat timeZoneDayFormat = null; 
     if (includeTime) { 
      timeZoneDayFormat = targetTimeZoneFormat; 
     } else { 
      timeZoneDayFormat = new SimpleDateFormat("dd-MMM-yy z"); 
     } 
     timeZoneDayFormat.setTimeZone(TimeZone.getTimeZone(targetTimeZoneId)); 
     try { 
      result = timeZoneDayFormat.format(targetTimeZoneFormat.parse(date1)); 
      // System.out.println("CHANGING TIMEZONE:3 "+result); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 
     return result; 
    } 
} 

回答

0

避免3个字母的时区代码

避免这些三字母时区代码。它们既不标准也不唯一。例如,您使用“IST”可能意味着印度标准时间,爱尔兰标准时间以及其他标准时间。

正确使用time zone names。时区及其名称的定义会经常更改,因此请将源保持最新。例如,旧的“亚洲/加尔各答”现在是“亚洲/加尔各答”。而不仅仅是名字;政府在最后时刻偶尔会改变时区的规则/行为而臭名昭着。

避免j.u.Date

避免使用捆绑java.util.Date和Calendar类。它们出了名的麻烦,并将在Java 8中被新的java.time.* package(它的灵感来源于Joda-Time)所取代。

乔达时间

目前,使用Joda-Time 2.3。

请注意java.util.Date对象,它们看起来像是有时区但实际上没有。在Joda-Time,DateTime确实知道其指定的时区。一般应该指定一个期望的时区。否则,JVM的默认时区将被分配。

Joda-Time主要使用不可变对象。不是修改实例,而是创建一个新的实例。当调用toDateTime等方法时,会返回一个新的DateTime实例,使原始对象保持不变并保持不变。

//DateTime now = new DateTime(); // Default time zone automatically assigned. 

// Convert a java.util.Date to Joda-Time. 
java.util.Date date = new java.util.Date(); 
DateTime now = new DateTime(date); // Default time zone automatically assigned. 

DateTimeZone timeZone = DateTimeZone.forID("Asia/Kolkata"); 
DateTime nowIndia = now.toDateTime(timeZone); 

// For UTC/GMT, use built-in constant. 
DateTime nowUtcGmt = nowIndia.toDateTime(DateTimeZone.UTC); 

// Convert from Joda-Time to java.util.Date. 
java.util.Date date2 = nowIndia.toDate(); 

转储到控制台...

System.out.println("date: " + date); 
System.out.println("now: " + now); 
System.out.println("nowIndia: " + nowIndia); 
System.out.println("nowUtcGmt: " + nowUtcGmt); 
System.out.println("date2: " + date2); 

运行时...

date: Sat Jan 25 16:52:28 PST 2014 
now: 2014-01-25T16:52:28.003-08:00 
nowIndia: 2014-01-26T06:22:28.003+05:30 
nowUtcGmt: 2014-01-26T00:52:28.003Z 
date2: Sat Jan 25 16:52:28 PST 2014 
0

在处理Google API中的时区问题时。我遇到过这样的问题。

看看这块的你的代码: -

System.out.println(getDateStringToShow(formatter.parse("26-Nov-10 03:31:20 PM 
+0530"),"Asia/Calcutta", "Europe/Dublin", false)); 
System.out.println(getDateStringToShow(formatter.parse("02-Nov-10 10:00:00 AM 
+0530"),"Asia/Calcutta", "Europe/Dublin", false)); 

如果我给上面的输入将运行良好,我们想要的方式。


如果你还想去用这种方式,那么你必须根据你的需要来进行计算。

像调整时间数学和类似的东西。对于你的情况


还是一个简单的解决会是这样的

SimpleDateFormat d =new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); 
d.setTimeZone(TimeZone.getTimeZone("Europe/Dublin")); 
Date firsttime = d.parse("2013-12-19T03:31:20"); 
Date seondtime = d.parse("2013-12-19T10:00:00"); 

System.out.println(getDateStringToShow(firsttime,"Asia/Calcutta", 
"Europe/Dublin", false)); 
System.out.println(getDateStringToShow(seondtime,"Asia/Calcutta", 
"Europe/Dublin", false)); 

我的建议将是参考JODA API。更优于老学校的日期。

相关问题