【问题标题】:Time in seconds to custom string format自定义字符串格式的时间(以秒为单位)
【发布时间】:2011-11-13 23:22:58
【问题描述】:

我正在尝试使用秒来获取双精度值以转换为自定义时间格式。我已经尝试过 SimpleDate 格式,但这不起作用...

我有一个这种格式的双精度值:407.33386569554585(表示 407 秒和 333 毫秒...)。

我需要这种格式:HH/MM/SS.MS

我该怎么做?

提前致谢!

【问题讨论】:

  • 该值如何进入该双变量?以及如何构造双精度值 - 我再也看不到任何秒数了:)
  • 同意,这个 double 代表什么?
  • 你可以在这里得到一些想法:stackoverflow.com/questions/266825/…
  • 秒和毫秒,例如 407 秒和 333865.... 毫秒

标签: java date time


【解决方案1】:

乘以 1,000,然后转换为 long 并用它构造一个 Date。

Date date = new Date((long)(dubTime*1000));

从这里,您可以使用 SimpleDateFormat 来制作您想要的字符串。

String formattedDate = new SimpleDateFormat("HH/mm/ss.SSS").format(date);

【讨论】:

  • 它不断增加 9 小时 30 分钟......有趣的是,那是我的时区 +9:30......
  • 听起来您可能想要设置DateLocale 或在构造后更改Locale。没有把握。基本上,您传递的long 将被解释为自格林威治标准时间 1970 年 1 月 1 日以来经过的毫秒数。如果您所拥有的时间的double 值不是自该纪元以来的秒数,则您需要执行额外的转换才能做到这一点。
【解决方案2】:

Java 8 风格(如果你想避免日期弃用警告):

DateTimeFormatter formatter =
    DateTimeFormatter.ofPattern("HH/mm/ss.SSS").withZone(ZoneId.of("UTC"));
Instant instant = Instant.ofEpochMilli((long)(dubTime*1000));
return formatter.format(instant);

【讨论】:

  • 日期尚未被弃用。
  • 是的,关于伊达死讯的报道有些夸张。 :-)
【解决方案3】:

这是我们使用的一些代码,您可以轻松适应。下面的实现将打印一个值为 00days 00h00m00s00ms:

public final static long ONE_MILLISECOND = 1;
public final static long MILLISECONDS_IN_A_SECOND = 1000;

public final static long ONE_SECOND = 1000;
public final static long SECONDS_IN_A_MINUTE = 60;

public final static long ONE_MINUTE = ONE_SECOND * 60;
public final static long MINUTES_IN_AN_HOUR = 60;

public final static long ONE_HOUR = ONE_MINUTE * 60;
public final static long HOURS_IN_A_DAY = 24;
public final static long ONE_DAY = ONE_HOUR * 24;
public final static long DAYS_IN_A_YEAR = 365;

public String formatHMSM(Number n) {


    String res = "";
    if (n != null) {
        long duration = n.longValue();

        duration /= ONE_MILLISECOND;
        int milliseconds = (int) (duration % MILLISECONDS_IN_A_SECOND);
        duration /= ONE_SECOND;
        int seconds = (int) (duration % SECONDS_IN_A_MINUTE);
        duration /= SECONDS_IN_A_MINUTE;
        int minutes = (int) (duration % MINUTES_IN_AN_HOUR);
        duration /= MINUTES_IN_AN_HOUR;
        int hours = (int) (duration % HOURS_IN_A_DAY);
        duration /= HOURS_IN_A_DAY;
        int days = (int) (duration % DAYS_IN_A_YEAR);
        duration /= DAYS_IN_A_YEAR;
        int years = (int) (duration);
        if (days == 0) {
            res = String.format("%02dh%02dm%02ds%03dms", hours, minutes, seconds, milliseconds);
        } else if (years == 0) {
            res = String.format("%ddays %02dh%02dm%02ds%03dms", days, hours, minutes, seconds, milliseconds);
        } else {
            res = String.format("%dyrs %ddays %02dh%02dm%02ds", years, days, hours, minutes, seconds);
        }
    }
    return res;

}

【讨论】:

    【解决方案4】:

    只是添加到蒂姆的答案:无论您的时区如何,都要获得正确的字符串,只需使用SimpleDateFormat.setTimeZone()

    DateFormat dateFormat = new SimpleDateFormat("HH/mm/ss.SSS");
    dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
    // ...
    double doubleTime=1000.0;
    Date date = new Date((long) (doubleTime*1000));
    String formattedTime = dateFormat.format(date);
    

    请务必查阅 DateFormat.setTimeZone javadoc 以了解 timeZone 何时可能被覆盖。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-07
      • 2019-01-13
      • 1970-01-01
      • 2021-03-16
      • 2013-03-03
      • 2014-04-10
      • 2017-09-13
      • 1970-01-01
      相关资源
      最近更新 更多