当前位置: 首页 > 知识库问答 >
问题:

SimpleDateFormat有时会错误地格式化小时

鄢晔
2023-03-14

我想将我的时间戳转换为XXhours:YYminutes字符串。我的方法有时可以正常工作,除非它获得更大的值。例如,

193500000 -

    SimpleDateFormat dateFormat = new SimpleDateFormat("HH'hours' mm'minutes'");
    dateFormat.setTimeZone( TimeZone.getTimeZone( "GMT"));
    String string  = dateFormat.format(totalTime);

共有3个答案

狄旻
2023-03-14

talex的回答是正确的,您应该为此使用< code >持续时间。在Java 9格式中,编写和阅读< code>Duration变得更加容易和简单:

public static String formatDuration(long totalTimeMillis) {
    Duration totalDuration = Duration.ofMillis(totalTimeMillis);
    return String.format(Locale.ENGLISH,
            "%02d hours %02d minutes",
            totalDuration.toHours(),
            totalDuration.toMinutesPart());
}

我们不再需要模运算(或类似的)来查找分钟。为了演示我使用问题中的时间值调用了上述方法:

    System.out.println(formatDuration(60300000));
    System.out.println(formatDuration(63900000));
    System.out.println(formatDuration(108000000));
    System.out.println(formatDuration(117000000));
    System.out.println(formatDuration(193500000));

它打印您要求的结果:

16 hours 45 minutes
17 hours 45 minutes
30 hours 00 minutes
32 hours 30 minutes
53 hours 45 minutes

我在数字和单位之间加了一个空格,我觉得这样可读性更强,如果你不想要的话可以去掉。

格式字符串中的d说明符确保您在问题中获得带有前导零的两位数:formatDuration(14700000),例如产生04小时05分钟

SimpleDateFormat用于格式化日期和/或一天中的时间,而不是持续时间或经过的时间。我说“was”是因为那个类现在已经过时了,而且由于它也是出了名的麻烦,我建议你不要再使用它了。要设置日期或一天中的小时的格式,请使用 java.time 中的 DateTimeFormatter

卓学智
2023-03-14

不幸的是,使用SimpleDataFormat是不可能的。“HH”是指一天中的一小时。如果日期超过24小时,则结果将为模24。

我建议您使用新的时间API编写自定义代码

下面是一个例子:

    Duration duration = Duration.ofMillis(193500000);

    long minutes = duration.toMinutes() % 60;
    long hours = duration.toHours();

    System.out.println("" + hours + "hours:"+minutes+"minutes");
尹兴生
2023-03-14

仔细再看一遍这个:https://docs . Oracle . com/javase/7/docs/API/Java/text/simple date format . html

HH是一天中的几个小时,永远不会超过24:-)

你想要的可能是这样的:

    int msecPerHour = 3600*1000;
    int hours = totalTime/msecPerHour;
    int msecPerMinute = 60*1000;
    int minutes = totalTime/msecPerMinute - hours*60;
    String str = "" + hours + " hours " + minutes + " minutes";
 类似资料:
  • 问题内容: 我不需要整个故事来澄清我的问题,所以我只显示代码(仅是示例)。我的结果怎么会有差异? 码 输出量 问题答案: 如果您在伦敦或巴黎,则时区为1970年1月1日GMT + 1。 由于@ARC在评论中解释的原因,英国于1968年2月18日至1971年10月31日使用了GMT + 1或UTC + 1 我可以转换很长时间而不会干扰任何时区吗? 将TimeZone设置为GMT。 版画

  • 第二个选项(来自Java SimpleDateFormat(“yyyy-mm-dd't'hh:mm:ss'z'”)将时区作为IST提供) 在这两种情况下,时间都错了。我的笔记本电脑或手机显示的不是当地时间,但输出时间是提前2小时。我怎么才能改变呢?我想有柏林(CEST)的当前时间也显示在我的电脑上。我感谢每一个评论。

  • 本文向大家介绍使用SimpleDateFormat格式化日期,包括了使用SimpleDateFormat格式化日期的使用技巧和注意事项,需要的朋友参考一下 SimpleDateFormat是一个具体的类,用于以对语言环境敏感的方式来格式化和解析日期。SimpleDateFormat允许您从选择任何用户定义的日期时间格式模式开始。 示例 这将产生以下结果- 输出结果 简单的DateFormat格式代

  • 问题内容: 我想要实现一个接受与参数相同的版本,因此我编写了以下函数: 但是,它成为内部的单个数组参数,从而导致仅在格式字符串中填写单个参数。如何强制解释为可变数量的参数? 问题答案: 已经做了您想做的事。查看其来源,可以看到出了什么问题: 请注意,您的代码缺少after 。从规格: 将参数传递给…参数 如果最终参数可分配给切片类型,则在参数后跟时可以将其作为参数的值原样传递。在这种情况下,不会创

  • 问题内容: 我目前正在使用DateUtils类,该类可帮助格式化整个系统中的日期。我有一个格式为yyyyMMdd的日期,该日期是从字符串解析的。 我进入另一种格式,以接收格式为E d MMM YY的“期间”值。 下面,应该给我一段MON 31 DEC 18的时间。但是,它正在返回MON 31 DEC19。为什么这一年向前发展? 谢谢 问题答案: 您有错别字用途,而不是。 从文档: y:年 Y:周年

  • 问题内容: 我有一个将a解析为: 当我解析这个: 结果将是,当使用时: 8月29日 2011 00:44:00 当然,这应该是: 8月29日 2011 12:44:00 当我解析这个: 然后结果如预期的那样: 8月29日 2011 13:44:00 我怎样才能解决这个问题? 问题答案: 使用代替小时模式: