【问题标题】:Get only TimeZone field from new Date() in java仅从 java 中的 new Date() 获取 TimeZone 字段
【发布时间】:2014-07-23 14:14:39
【问题描述】:

要求:我只想从 new Date() 获取 TimeZone 字段,截至目前从 new Date() 获取结果为

Wed Jul 23 19:37:20 GMT+05:30 2014,但我只想要 GMT+05:30,有没有办法只得到这个?

PS:我不想使用 split 来获取时区字段。因为这是我实现上述要求的最后选择。

【问题讨论】:

  • A Date 没有时区。当你打印它的字符串形式时,你会看到TimeZone.getDefault()返回的时区。

标签: java date timezone


【解决方案1】:

您应该使用Calendar 类,并可能使用实现GregorianCalendar。很多 Date 函数已被弃用,取而代之的是使用 Calendar。 Java 8 有 Clock API,但我在这里假设 Java 7。

这样你就可以做到:

Calendar calendar = new GregorianCalendar();
TimeZone tz = calendar.getTimeZone();

然后从那里开始工作。

【讨论】:

    【解决方案2】:

    假设您必须使用 String 输入,您可以执行以下操作:

    // format : dow mon dd hh:mm:ss zzz yyyy
    String date = "Wed Jul 23 19:37:20 GMT+05:30 2014";
    Pattern pattern = Pattern
        .compile("^\\w{3}\\s\\w{3}\\s\\d{2}\\s\\d{2}:\\d{2}:\\d{2}\\s?(.*)\\s\\d{4}$");
    Matcher matcher = pattern.matcher(date);
    if (matcher.matches()) {
      String timezone = matcher.group(1);
      // beware : according to the Date.toString() documentation the timezone
      // value can be empty
      System.out.println(timezone);
    } else {
      System.out.println("doesn't match!");
    }
    

    【讨论】:

      【解决方案3】:

      导入java.util包并使用GregorianCalendar方法。

      int second, minute, hour;
      GregorianCalendar date = new GregorianCalendar();
      
      second = date.get(Calendar.SECOND);
      minute = date.get(Calendar.MINUTE);
      hour = date.get(Calendar.HOUR);
      
      System.out.println("Current time is  "+hour+" : "+minute+" : "+second);
      

      不要使用 java.util 包的 Date 和 Time 类,因为它们的方法已被弃用,这意味着将来的 JDK 版本可能不支持它们。

      【讨论】:

        【解决方案4】:

        生成带偏移但没有日期和时间的字符串

        您的问题不准确。 java.util.Date 没有时区(假设始终使用 UTC)。 JVM 的时区应用于对象的toString 方法和生成字符串表示的其他格式代码。这就是您的解决方案:使用日期时间格式化程序生成一个字符串,该字符串仅包含距 UTC 的偏移量,不包含日期或时间部分。

        避免java.util.Date & .Calendar

        避免使用捆绑的 java.util.Date 和 .Calendar 类,因为它们非常麻烦。而是使用 Joda-Time 或新的 java.time 包。两者都支持将时区作为日期时间对象的一部分。

        乔达时间

        以下是如何在 Joda-Time 2.3 中生成 DateTime 的字符串表示形式。

        DateTime dateTime = new DateTime( DateTimeZone.forID( "Asia/Kolkata" ) );
        DateTimeFormatter formatter = DateTimeFormat.forPattern( "ZZ" );
        String offset = formatter.print( dateTime );  // generates: +05:30
        

        在 Joda-Time 2.3 中,您可以向 DateTime 对象询问其分配的时区作为对象。然后您可以询问DateTimeZone 对象。

        DateTime dateTime = new DateTime( DateTimeZone.forID( "Asia/Kolkata" ) );
        DateTimeZone timeZone = dateTime.getZone();
        String id = timeZone.getID();
        

        【讨论】:

        • 虽然我是Joda-Time 的粉丝并在我的项目中使用它,但如果你真的担心你的库占用空间,你仍然可以解决它。
        • 日期和日历并不像 Joda 的布道者想相信的那么糟糕。他们当然不是出了名的麻烦。正如 Davio 正确指出的那样,需要考虑在使用附加库和依赖第三方库来扩大应用程序之间进行权衡。
        • @VGR 您必须将 Sun 和 Oracle 都包括在 Joda Evangelists 列表中,因为他们选择用添加到 Java 8 的新 java.time package 取代那些旧的 .Date/.Calendar 类并受到 Joda-Time 的启发。如果 Sun 和 Oracle 可以放弃这些课程,也许您也应该考虑这样做。
        • 我总是使用 java.time(除非旧版 API 另有要求)。但是您不支持使用 java.time,您建议使用第三方库。更重要的是 Date 和 Calendar 确实工作得很好,而且它们“臭名昭著的麻烦”的概念并不是我会选择在事实答案中提出的。
        猜你喜欢
        • 2019-03-12
        • 2018-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-22
        • 2019-11-19
        • 1970-01-01
        • 2015-10-21
        相关资源
        最近更新 更多