【问题标题】:Java SimpleDateFormat format issue with yyyyyyyy 的 Java SimpleDateFormat 格式问题
【发布时间】:2014-09-10 23:38:04
【问题描述】:

我在使用 SimpleDateFormat 对象的 format 方法时遇到问题。

有问题的代码是:

new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()).format(date);

其中“日期”是使用 Calendar.getTimeInMillis() 中的 long int 创建的 Date 对象;

Calendar cal = Calendar.getInstance();
Date date = new Date(cal.getTimeInMillis());

除了字符串的年份部分外,一切正常。当我传递日期时,输出的字符串如下所示:

0044-09-10 05:30:24 

传递的日期对象是从返回的长整数创建的:

Calendar.getTimeInMillis();

我相信从这个方法返回的数字是从 1 月 1 日开始计算的毫秒数。 1970 年,我认为这是问题所在,但即使我加上 1970 年的毫秒数(哈哈,可能是错误的做法,但值得一试:P),它仍然解析为 0044年部分。

我已经进行了无数次谷歌搜索,似乎都在传递给 SimpleDateFormat 构造函数的字符串中指出了简单的问题,所以我在这里不知所措。

非常感谢任何帮助。

如果需要任何其他信息,请告诉我,我会尽力提供。

再次感谢!

编辑:

我想我会多解释一下上下文:

技术人员将拨打电话,并在到达现场后将电话标记为“已开始”。 然后应用程序将创建一个Calendar 实例并保存从Calendar.getTimeInMillis() 返回的long int。

当技术人员完成通话后,他/她会将通话标记为“完成”。再次创建一个Calendar 实例,并保存从Calendar.getTimeInMillis() 返回的long int。

这样可以轻松计算“通话时长”。

现在,当使用技术人员在应用程序中使用的结束表单时,调用期间保存的长整数将传递给 Date 对象,然后将其传递给 SimpleDateFormat.format() 方法。

这就是问题出现的地方。再次感谢,希望对您有所帮助。

【问题讨论】:

  • 尝试使用返回 Date 对象的 Calendar#getTime,尝试比较返回的 Date 和 Calendar#getTimeMillis 方法的毫秒数
  • 如果您使用的是 java 8,请使用新的 Time API,否则,请使用 JodaTine,它们会更好地计算持续时间,然后彼此减去毫秒
  • 从 Calendar.getInstance() 返回的类的名称是什么?
  • 您的代码在我的机器上运行良好。您系统上的当前日期/时间是什么?
  • 您使用的是什么版本的 Java?

标签: java simpledateformat


【解决方案1】:

要计算日期/时间之间的持续时间,不要依赖减去毫秒,这是非常不可靠的。

如果您使用的是 Java 8,则应利用新的 java.time API,例如...

LocalDateTime dt1 = LocalDateTime.of(2014, 9, 11, 10, 0);
LocalDateTime dt2 = LocalDateTime.of(2014, 9, 11, 12, 0);

Duration duration = Duration.between(dt1, dt2);
System.out.println(duration.toDays());
System.out.println(duration.toHours());
System.out.println(duration.toMinutes());
System.out.println(duration.getSeconds());

哪些输出...

0
2
120
7200

查看Period and Duration了解更多详情。

或者,您可以使用 JodaTimejava.time 的基础)

【讨论】:

  • 我之前并不清楚,这是一个安卓应用程序,我认为它不会使用 1.8 合规性进行编译。目前,此应用设置为 1.7
  • 我不确定是否可以使用 Time API
  • 为什么使用 epoc 时间不可靠?我只采用这种方法是因为我父亲,一位开发人员告诉我,使用秒或毫秒是可靠的
  • 如果我从晚上 11 点开始并在凌晨 1 点结束会怎样?夏令时会发生什么?闰年和秒会发生什么?计算持续时间并不像相互减去毫秒值那么简单......
  • 这是其中一个领域,专用库将为您节省大量时间和头疼 ;)
【解决方案2】:

Calendar.getTimeinMillis() 返回的时间是“纪元”时间以来的毫秒数。查阅Date 类的javadoc,可以发现“epoch”是January 1, 1970, 00:00:00 GMT。因此,您的代码应该没问题。我已经使用以下代码进行了测试:

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;


public class Cal {

    public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();
        Date date = new Date(cal.getTimeInMillis());

        new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()).format(date);

        System.out.println(date);
    }

}

它给出了正确的输出:

Thu Sep 11 09:48:30 KST 2014

我想提一下的是“通话时长”不是日期。如果您尝试将两个 long 值之间的减法结果转换为 Date 对象,它将失败,因为减法将从 long 值中消除时间的自新纪元部分。减法的结果只是一毫秒。

【讨论】:

    【解决方案3】:

    好的,我已经解决了这个问题。事实证明,我没有提供足够的信息让每个人都能正确解决这个问题。

    在应用程序中,我使用了两个选择器,一个用于日期,一个用于时间,在保存日期时,它会保存所选日期,时间设置为 00:00:00 并将其转换为 long int in毫秒。

    使用:

    Calendar cal = Calendar.getInstance();
    cal.set(year, month, day);
    

    当保存时间时,它会保存使用相同方法选择的时间,但是当我调用cal.set() 时,我将年月日设置为 0。

    cal.set(0, 0, 0, hour, minute, second);
    

    将此语句更改为

    cal.set(1970, 0, 1, hour, minute, second);
    

    解决了这个问题。我很抱歉浪费大家的时间,因为这只是我的一个逻辑错误..

    衷心感谢提供的所有帮助。

    【讨论】:

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