国家/地区的Java时间加载日期并转换为本地时间
我需要在java变量中加载一个日期,例如:“14-03-2015 14:00:00”。但那个日期是格林尼治标准时间+4 我想把它转换成我当地的时间,也就是格林尼治标准时间+1 我在一个国家看到了很多转换来获取当地时间。例如,此代码显示墨尔本和马德里的本地日期,但没有显示我正在搜索的日期国家/地区的Java时间加载日期并转换为本地时间,java,time,jodatime,java-time,Java,Time,Jodatime,Java Time,我需要在java变量中加载一个日期,例如:“14-03-2015 14:00:00”。但那个日期是格林尼治标准时间+4 我想把它转换成我当地的时间,也就是格林尼治标准时间+1 我在一个国家看到了很多转换来获取当地时间。例如,此代码显示墨尔本和马德里的本地日期,但没有显示我正在搜索的日期 DateTime dt = new DateTime(org.joda.time.DateTimeZone.forID("Australia/Melbourne")); DateTimeZone dtZone =
DateTime dt = new DateTime(org.joda.time.DateTimeZone.forID("Australia/Melbourne"));
DateTimeZone dtZone = DateTimeZone.forID("Europe/Madrid");
DateTime dtus = dt.withZone(dtZone);
提前多谢;) 您不需要使用Joda time,使用核心Java库进行计算非常容易。仅计算时间差是不够的,应考虑夏季和冬季时间开关 应使用Java的时区#getRawOffset,时区#getDSTSavings,时区#inDaylightTime方法。使用时区#getRawOffset获取UTC时间的时间偏移。请特别注意这种方法,因为这不会返回dayligth储蓄。使用时区#GetDstSaves获取以毫秒为单位的日间偏移时间。最后使用时区#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
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
检查上的正确性。3月13日有10个小时的时差
让我们在6月13日(马德里的夏季)测试代码。此外,还有夏季和冬季之间的切换
这是代码的输出
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
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
您可以在上检查计算的正确性
此外,我完全同意@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);
另见强>
无论时区是什么,java.util.Date对象(不是JodaTime)都是相同的。在幕后,它总是GMT。在解析(创建日期对象)或打印它时,您只需要担心时区
使用时区设置为+4的SimpleDataFormat来解析和创建日期对象。
使用时区设置为+1的其他SimpleDataFormat格式化同一日期对象以进行打印
您可以在SimpleDataFormat上调用setTimeZone,也可以使用包含时区的格式字符串构造它 那么,你在找什么?你期望输出是什么,而这段代码给了你什么?当代码从一个时区转换到另一个时区时,你并不清楚你在寻找什么。问题是您需要在该时区解析它吗?请更具体一点,否则很难帮助您。我需要在java变量中加载GMT+4中的日期,并将其转换为我的本地时间,即GMT+1Granted,没有Joda也可以,但核心java日期实用程序已严重损坏(并在java 8中被替换)。在这一点上,使用Joda库进行尽可能多的数据处理是一种公认的最佳实践。