国家/地区的Java时间加载日期并转换为本地时间

国家/地区的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 =

我需要在java变量中加载一个日期,例如:“14-03-2015 14:00:00”。但那个日期是格林尼治标准时间+4

我想把它转换成我当地的时间,也就是格林尼治标准时间+1

我在一个国家看到了很多转换来获取当地时间。例如,此代码显示墨尔本和马德里的本地日期,但没有显示我正在搜索的日期

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库进行尽可能多的数据处理是一种公认的最佳实践。