我需要加载一个日期,例如:" 14-03-2015 14:00:00"在一个java变量中。但那个日期是GMT +4
我想将其转换为当地时间GMT +1
我已经看到很多转换来获得一个国家的当地时间。例如,此代码显示墨尔本和马德里的当地日期,但不是我要搜索的。
DateTime dt = new DateTime(org.joda.time.DateTimeZone.forID("Australia/Melbourne"));
DateTimeZone dtZone = DateTimeZone.forID("Europe/Madrid");
DateTime dtus = dt.withZone(dtZone);
提前多多谢谢;)
答案 0 :(得分:0)
您不需要使用Joda时间,使用核心Java库计算非常容易。仅计算时差是不够的,应考虑夏季和冬季时间的转换。
TimeZone #getRawOffset , TimeZone#getDSTSavings ,应该使用TimeZone#inDaylightTime Java方法。使用 TimeZone#getRawOffset 获取UTC时间的时间偏移。特别注意这种方法,因为这不会返回dayligth节省。使用 TimeZone#getDSTSavings 获取dayligth偏移时间(以毫秒为单位)。最后使用 TimeZone#inDaylightTime 来检查DST中的时间。
这是完整的代码;
TimeZone timeZoneMelbourne = TimeZone.getTimeZone("Australia/Melbourne");
TimeZone timeZoneMadrid = TimeZone.getTimeZone("Europe/Madrid");
System.out.println("timeZoneMelbourne.getRawOffset() -> " + timeZoneMelbourne.getRawOffset());
System.out.println("timeZoneMadrid.getRawOffset() -> " + timeZoneMadrid.getRawOffset());
System.out.println("timeZoneMelbourne.getDSTSavings() -> " + timeZoneMelbourne.getDSTSavings());
System.out.println("timeZoneMadrid.getDSTSavings() -> " + timeZoneMadrid.getDSTSavings());
Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR, 2015);
c.set(Calendar.MONTH, 2);
c.set(Calendar.DAY_OF_MONTH, 13);
c.set(Calendar.HOUR_OF_DAY, 20);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
int timeDiff = timeZoneMadrid.getRawOffset() - timeZoneMelbourne.getRawOffset();
int madridDST = 0;
int melbourneDST = 0;
if(timeZoneMadrid.inDaylightTime(c.getTime()))
{
madridDST = timeZoneMadrid.getDSTSavings();
System.out.println("timeZoneMadrid#inDaylightTime -> " + madridDST);
}
if(timeZoneMelbourne.inDaylightTime(c.getTime()))
{
melbourneDST += timeZoneMelbourne.getDSTSavings();
System.out.println("timeZoneMelbourne#inDaylightTime -> " + melbourneDST);
}
timeDiff = timeDiff - melbourneDST + madridDST;
System.out.println("total timeDiff -> " +timeDiff);
System.out.println("timeZoneMelbourne -> " +c.getTime());
c.add(Calendar.MILLISECOND, timeDiff);
System.out.println("timeZoneMadrid -> " +c.getTime());
代码的输出;
timeZoneMelbourne.getRawOffset() -> 36000000
timeZoneMadrid.getRawOffset() -> 3600000
timeZoneMelbourne.getDSTSavings() -> 3600000
timeZoneMadrid.getDSTSavings() -> 3600000
timeZoneMelbourne#inDaylightTime -> 3600000
timeDiff -> -36000000
timeZoneMelbourne -> Fri Mar 13 20:00:00 EET 2015
timeZoneMadrid -> Fri Mar 13 10:00:00 EET 2015
检查this上的正确性。 3月13日有10个小时的差异。
让我们测试6月13日的代码,这是马德里的夏季时间。此外,夏季和冬季之间会有转换。
这是代码的输出;
timeZoneMelbourne.getRawOffset() -> 36000000
timeZoneMadrid.getRawOffset() -> 3600000
timeZoneMelbourne.getDSTSavings() -> 3600000
timeZoneMadrid.getDSTSavings() -> 3600000
timeZoneMadrid#inDaylightTime -> 3600000
total timeDiff -> -28800000
timeZoneMelbourne -> Sat Jun 13 20:00:00 EEST 2015
timeZoneMadrid -> Sat Jun 13 12:00:00 EEST 2015
您可以在this
上查看计算的正确性此外,我完全同意@ dimo414。最佳做法是使用Joda时间进行日期和时间操作。
这是Joda代码;
Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR, 2015);
c.set(Calendar.MONTH, 5);
c.set(Calendar.DAY_OF_MONTH, 13);
c.set(Calendar.HOUR_OF_DAY, 20);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
LocalDateTime dateTime = new LocalDateTime(c.getTime());
DateTime srcDateTime = dateTime.toDateTime(DateTimeZone.forID("Australia/Melbourne"));
DateTime dstDateTime = srcDateTime.withZone(DateTimeZone.forID("Europe/Madrid"));
Date madridTime =dstDateTime.toLocalDateTime().toDateTime().toDate();
System.out.println("Melbourne Time -> "+srcDateTime.toDateTime());
System.out.println("Madrid Time -> "+madridTime);
另见;
答案 1 :(得分:0)
无论时区是什么,java.util.Date对象(不是JodaTime)都是相同的。在幕后,它总是GMT。在解析(创建Date对象)或打印时,您只需要担心时区。
使用时区设置为+4的SimpleDateFormat来解析和创建Date对象。 使用时区设置为+1的其他SimpleDateFormat格式化相同的Date对象进行打印。
您可以在SimpleDateFormat上调用setTimeZone,也可以使用包含时区的格式字符串构造它。 http://docs.oracle.com/javase/7/docs/api/java/text/DateFormat.html#setTimeZone(java.util.TimeZone)