Java time load国家/地区的日期并转换为localtime

时间:2015-03-13 17:21:18

标签: java time jodatime java-time

我需要加载一个日期,例如:" 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);

提前多多谢谢;)

2 个答案:

答案 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);

另见;

TimeZone#getRawOffset

TimeZone#getDSTSavings

TimeZone#inDaylightTime

答案 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)