【问题标题】:SimpleDateFormat getHours() return incorrect valueSimpleDateFormat getHours() 返回不正确的值
【发布时间】:2012-12-23 11:13:15
【问题描述】:

为什么 getHours() for "09:50" 返回 8? 代码:

SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
Date date = sdf.parse("09:50");
int hours = date.getHours(); // return 8 instead of 9 ???

【问题讨论】:

  • getHours() 已弃用。你甚至不应该使用它。
  • SimpleDateFormat 对区域设置敏感,您的时区不是 GMT-1 吗?此外,请考虑使用 Joda TIme 而不是 Java 的内置日期函数。这一次,SimpleDateFormat 不是线程安全的,而 Joda Time 的 DateTimeFormatter 是。
  • 你想要当前时间吗???
  • 我无法复制。我得到 9。

标签: java android simpledateformat


【解决方案1】:
            Calendar prueba = Calendar.getInstance();

        prueba.set(2013, 1, 6, 10, 49, 32);

        int day = prueba.get(Calendar.DAY_OF_MONTH);
        int month = prueba.get(Calendar.MONTH);
        int year = prueba.get(Calendar.YEAR);
        int hours = prueba.get(Calendar.HOUR);
        int minutes = prueba.get(Calendar.MINUTE);
        int seconds = prueba.get(Calendar.SECOND);

        Log.v("printf", "Date: " + day + "/"
                                 + month + "/"
                                 + year + "\n");
        Log.v("printf", "Time: " + hours + ":"
                                 + minutes + ":"
                                 + seconds + "\n");

PD:记住日历类中的字段月份从 0 开始(0-一月,1-二月,...) PD2:我在过滤器 logcat 上有个性化标签,称为“printf”。为您使用的标签更改它。

【讨论】:

    【解决方案2】:

    您的 SimpleDateFormat 似乎未设置为默认时区。 调用:

    sdf.setTimeZone(TimeZone.getDefault());
    

    在解析文字之前应该可以解决您的问题。 我已经测试了以下代码:

    ...
        public static final SimpleDateFormat CDfTimestamp = new SimpleDateFormat(
                "yyyy-MM-dd HH:mm:ss");
    ...
        Date da1 = null;
        for (String dl1 : new String[] { "1970-01-01 12:34:56",
                "2016-01-01 12:34:56" }) {
            try {
                CDfTimestamp.setTimeZone(TimeZone.getTimeZone("GMT+05:00"));
                da1 = CDfTimestamp.parse(dl1);
                System.out.printf("parse GMT+05:00 %s -> %d %d %d (os=%d)\n", dl1, da1
                        .getHours(), da1.getMinutes(), da1.getSeconds(), CDfTimestamp
                        .getTimeZone().getOffset(0));
                CDfTimestamp.setTimeZone(TimeZone.getTimeZone("UTC"));
                da1 = CDfTimestamp.parse(dl1);
                System.out.printf("parse UTC       %s -> %d %d %d (os=%d)\n", dl1, da1
                        .getHours(), da1.getMinutes(), da1.getSeconds(), CDfTimestamp
                        .getTimeZone().getOffset(0));
                CDfTimestamp.setTimeZone(TimeZone.getDefault());
                da1 = CDfTimestamp.parse(dl1);
                System.out.printf("parse default   %s -> %d %d %d (os=%d)\n", dl1, da1
                        .getHours(), da1.getMinutes(), da1.getSeconds(), CDfTimestamp
                        .getTimeZone().getOffset(0));
            } catch (ParseException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    ...
    

    获得以下输出:

    parse GMT+05:00 1970-01-01 12:34:56 -> 8 34 56 (os=18000000)
    parse UTC       1970-01-01 12:34:56 -> 13 34 56 (os=0)
    parse default   1970-01-01 12:34:56 -> 12 34 56 (os=3600000)
    parse GMT+05:00 2016-01-01 12:34:56 -> 8 34 56 (os=18000000)
    parse UTC       2016-01-01 12:34:56 -> 13 34 56 (os=0)
    parse default   2016-01-01 12:34:56 -> 12 34 56 (os=3600000)
    

    【讨论】:

      【解决方案3】:

      日期已弃用。你应该使用日历。

       SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
       Date date = sdf.parse("09:50");
       Calendar cal = new GregorianCalendar();
      cal.setTime(date);
      int hours = cal.get(Calendar.HOR_OF_DAY);
      

      【讨论】:

      • 日期已被弃用?这是一种误导和不正确的说法。请更正这一点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-30
      • 2020-07-15
      • 2016-10-09
      • 2021-10-26
      • 2015-10-13
      • 2014-12-06
      • 2021-02-01
      相关资源
      最近更新 更多