用Java确定另一个国家的互联网时间

时间:2013-12-23 12:15:24

标签: java time apache-commons apache-commons-net

我正在开发一个将被世界各地的人们使用的Java应用程序。一项功能要求它显示澳大利亚墨尔本当前时间。

我找到this回答并按如下方式修改了代码,但它返回了我当前的时间(正如预期的那样)。它使用Apache Commons Net library

    try {
        String TIME_SERVER = "time-a.nist.gov";   
        NTPUDPClient timeClient = new NTPUDPClient();
        InetAddress inetAddress = InetAddress.getByName(TIME_SERVER);
        TimeInfo timeInfo = timeClient.getTime(inetAddress);
        long returnTime = timeInfo.getMessage().getTransmitTimeStamp().getTime();
        return new Date(returnTime);
    } catch (Exception e) {
        System.out.println(e.getMessage());
        return null;
    }

如何修改此代码以返回墨尔本的时间,而不是我的时间?我也愿意接受其他解决方案来解决这个问题。

谢谢!

编辑:

根据Jon的建议,我使用了JodaTime library并构建了以下代码来解决问题。通过将澳大利亚/墨尔本更改为any timezone found here,可将其用于其他时区。

    try {
        //Get the time for the current time zone.
        String TIME_SERVER = "time-a.nist.gov";   
        NTPUDPClient timeClient = new NTPUDPClient();
        InetAddress inetAddress = InetAddress.getByName(TIME_SERVER);
        TimeInfo timeInfo = timeClient.getTime(inetAddress);
        long returnTime = timeInfo.getMessage().getTransmitTimeStamp().getTime();

        //Format it to the Melbourne TimeZone.
        DateTimeZone tzMelbourne = DateTimeZone.forID("Australia/Melbourne");
        return new DateTime(returnTime).toDateTime(tzMelbourne);
    } catch (Exception e) {
        System.out.println(e.getMessage());
        return null;
    }

3 个答案:

答案 0 :(得分:6)

您目前正在返回java.util.Date - 时区。这只是一个瞬间。它不在您的时区或其他时区 - 它只是一瞬间。当您拨打toString()时,会在您的本地时区给您一个文字表示,但这不是对象中数据的一部分。

如果您需要表示“特定时区的日期/时间”,那么您应该使用Calendar课程,或者理想情况下使用Joda Time这是很多更好的日期/时间API。

或者,如果您只是尝试格式化特定时区的日期/时间,则可以使用SimpleDateFormat - 设置时区,然后格式化{{ 1}}你已经回归的价值。

答案 1 :(得分:2)

您可以使用java.util.TimeZone来获取世界上特定地点的时间,而不是从NTP服务器查找。(它也知道节省日光) 您的时区ID是“澳大利亚/墨尔本”。

TimeZone australiaMelbourneTimeZone = TimeZone.getTimeZone("Australia/Melbourne");

Calendar dateTime = Calendar.getInstance(tz);

//Use this Calendar instance to print time

不是:我通过转储java.util.TimeZone支持的所有可用时区ID来找到时区ID Australia/Melbourne,如下所示:

   for(String timeZoneID: TimeZone.getAvailableIDs()) {
            System.out.println(timeZoneID);
   }

输出包括“澳大利亚/墨尔本”如下:

... 澳大利亚/布里斯班 澳大利亚/堪培拉 澳大利亚/柯里 澳大利亚/霍巴特 澳大利亚/林德曼 的澳大利亚/墨尔本 澳大利亚/新南威尔士州 澳大利亚/昆士兰 澳大利亚/悉尼 澳大利亚/塔斯马尼亚

答案 2 :(得分:1)

检查this。您可以获取日历实例并更改其时区。