【问题标题】:Get time with hour, minute, second, millisecond, microsecond获取时、分、秒、毫秒、微秒的时间
【发布时间】:2012-02-12 03:32:10
【问题描述】:

我有这个代码:

SimpleDateFormat sDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

我知道这段代码在时间上返回小时、分钟、秒。 我怎样才能得到毫秒和微秒??

【问题讨论】:

  • 可以的,看我的回答。
  • 为什么是-2???我认为没有理由对这个问题投反对票
  • 当我发布它的时候,用户正在为它而战,它是-3,然后是 +1...有时用户会因为他们的高评分而降低分数,如果您知道我的意思...
  • 我认为更多的是你的态度。
  • +1 因为我也看不出有任何理由不投票!

标签: java date


【解决方案1】:

获得微秒的唯一方法是自己解析字符串。注意:Date 应该用于存储微秒,但您可以使用long。 (您也可以使用毫秒或纳秒)

private static final String YEARS_TO_MINUTES = "yyyy-MM-dd HH:mm";
private static final SimpleDateFormat YEARS_TO_MINUTES_SDF = new SimpleDateFormat(YEARS_TO_MINUTES);

public static long parseMicroSeconds(String text) throws ParseException {
    long timeMS;
    synchronized (YEARS_TO_MINUTES_SDF) {
        timeMS = YEARS_TO_MINUTES_SDF.parse(text.substring(0, YEARS_TO_MINUTES.length())).getTime();
    }
    long microSecs = 0;
    if (text.length() > YEARS_TO_MINUTES.length() + 1) {
        double secs = Double.parseDouble(text.substring(YEARS_TO_MINUTES.length() + 1));
        microSecs = (long) (secs * 1e6 + 0.5);
    }
    return timeMS * 1000 + microSecs;
}

public static String formatMicroSeconds(long timeMicroSeconds) {
    String dateTime;
    synchronized (YEARS_TO_MINUTES_SDF) {
        dateTime = YEARS_TO_MINUTES_SDF.format(new Date(timeMicroSeconds / 1000));
    }
    long secs = timeMicroSeconds % 60000000;
    return dateTime + String.format(":%09.6f", secs / 1e6);
}


public static void main(String... args) throws ParseException {
    String dateTime = "2011-01-17 19:27:59.999650";
    long timeUS = parseMicroSeconds(dateTime);
    for (int i = 0; i < 5; i++)
        System.out.println(formatMicroSeconds(timeUS += 175));
}

打印

2011-01-17 19:27:59.999825
2011-01-17 19:28:00.000000
2011-01-17 19:28:00.000175
2011-01-17 19:28:00.000350
2011-01-17 19:28:00.000525

如果您需要纳米计时,您也可以这样做。

【讨论】:

  • 嗨彼得,我知道这不是主题,但很想知道为什么 YEARS_TO_MINUTES_SDF 是同步的。
  • @Mahesh SIMpleDateFormat 不是线程安全的。它通常可以在没有同步的情况下正常工作,但是由于它具有可变字段,因此您经常会得到一个损坏的值。
【解决方案2】:

通常毫秒以大写 s 给出,在您的情况下它将是 yyyy-MM-dd HH:mm:ss:SSS。更多信息请参考Customizing formats

【讨论】:

    【解决方案3】:

    你能做的最好的就是:

    SimpleDateFormat sDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
    

    【讨论】:

      【解决方案4】:

      这个例子得到毫秒。微秒不可用。

      Date someDate = sDate.parse(dateString);
      Calendar c = Calendar.setTime(someDate);
      int millisecond = c.get(Calendar.MILLISECOND);
      

      【讨论】:

        【解决方案5】:

        您不会有微秒,因为 Date 存储自 1970 年 1 月 1 日以来的毫秒数。对于毫秒,请使用 S,如 the javadoc 中所述。

        【讨论】:

        • 那么,你以为没有微秒就这么明显了??
        • 这并不明显,这就是我在回答中解释它的原因。不过,如果您阅读文档就很清楚了。你读了吗?
        • @lolo - 基于 JB Nizet 链接到的页面上的第一个表格中的“毫秒”字样?是的,我会这么说。
        • 如果有一种方法可以通过 SimpleDateFormat 获得微秒,它就会在那个表中。
        【解决方案6】:

        检查 SimpleDateFormat 的 Java-doc,它告诉: 毫秒:秒

        微秒不可用。

        【讨论】:

          【解决方案7】:

          您只能显示毫秒::SS

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-01-12
            • 2019-08-01
            • 1970-01-01
            • 1970-01-01
            • 2012-11-12
            • 2012-06-08
            • 1970-01-01
            相关资源
            最近更新 更多