【问题标题】:Getting negative value in date.gettime()在 date.gettime() 中获取负值
【发布时间】:2018-12-20 07:46:29
【问题描述】:

面对一个问题,我试图将字符串值解析为日期,当我尝试执行 date.getTime() 时,我得到了负值。

这是我正在解析的字符串“01:00:07”。 这是我得到“Thu Jan 01 01:00:07 GMT+05:30 1970”的日期对象中的值。 仍然在 getTime() 我得到负值“-16193000”

实现这一点的代码:

long sum = 0;
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("hh:mm:ss");// I have also tried "HH:mm:ss" format. it gives same result
    Date date = simpleDateFormat.parse(duration);//duration is "01:00:07"
    sum= date.getTime();

【问题讨论】:

  • sum 的数据类型是什么?希望你能坚持这么久
  • sum的数据类型是long
  • 你在哪个时区?
  • Date 和持续时间是两个完全不同的野兽。您的问题是您误用了另一个。参见例如Java 8 Time API: how to parse string of format “mm:ss” to Duration?
  • 仅供参考,java.util.Datejava.util.Calendarjava.text.SimpleDateFormat 等麻烦的旧日期时间类现在已被 java.time 类所取代。大多数 java.time 功能在 ThreeTen-Backport 项目中被反向移植到 Java 6 和 Java 7。进一步适用于ThreeTenABP 中的早期 Android (How to use ThreeTenABP…

标签: android date simpledateformat datetime-format


【解决方案1】:

问题是TimeZone。提供TimeZone,您将获得正确的时间

simpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));

simpleDateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));

【讨论】:

    【解决方案2】:

    问题是时区偏移。使用:

    long sum = 0;
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("hh:mm:ss");// I have also tried "HH:mm:ss" format. it gives same result
    Date date = null;//duration is "01:00:07"
    try {
        date = simpleDateFormat.parse("01:00:07");
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        sum= cal.getTimeInMillis() + (cal.get(Calendar.ZONE_OFFSET) + cal.get(Calendar.DST_OFFSET));
        System.out.println("Date =" + date);
        System.out.println("sum =" + sum);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    

    【讨论】:

    • 如果是12:00:07hhHH 将不会给出相同的结果。
    【解决方案3】:

    java.time

        String durationString = "01:00:07";
        durationString = durationString
                .replaceFirst("(\\d{2}):(\\d{2}):(\\d{2})", "PT$1H$2M$3S");
        Duration dur = Duration.parse(durationString);
        System.out.println(dur);
    

    Duration 输出这个奇数字符串:

    PT1H7S

    读作:1 小时 7 秒的时间段

    该字符串采用标准ISO 8601 格式。 Duration 只能解析标准格式。所以我使用String.replaceFirst 将您的字符串转换为它。

    让我猜猜,你需要总结持续时间吗?有一个plus 方法:

        Duration sum = Duration.ZERO;
        sum = sum.plus(dur);
    

    还有转换为秒或毫秒的方法。

    不要在一段时间内使用日期时间类。这会导致混乱和错误。

    如果您绝对不想要外部依赖项(仅在您升级到 API 级别 26 之前),请将您的字符串手动解析为秒,并在 int 中表示它们。将其包装在您自己的自定义类中。

    问题:我可以在 Android 上使用 java.time 吗?

    是的,java.time 在较旧和较新的 Android 设备上运行良好。它只需要至少 Java 6

    • 在 Java 8 及更高版本以及更新的 Android 设备(从 API 级别 26 起)中,现代 API 是内置的。
    • 在 Java 6 和 7 中,获取 ThreeTen Backport,即新类的后向端口(对于 JSR 310,ThreeTen;请参阅底部的链接)。
    • 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保从 org.threeten.bp 导入日期和时间类以及子包。

    链接

    【讨论】:

      【解决方案4】:

      simpleDateFormat .setTimeZone(TimeZone.getTimeZone("GMT"));你必须添加你的时区

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多