获取时间的小时、分钟、秒、毫秒、微秒

5

我有这段代码:

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

我知道这段代码返回时间中的小时、分钟和秒。如何获取毫秒和微秒?


可以做到,看我的答案。 - Peter Lawrey
1
为什么是-2?我看不出来有什么理由要踩这个问题。 - MedicineMan
2
我认为这更多取决于你的态度。 - Daniel T.
+1 因为我也没有看到任何理由来点踩! - marc wellman
对于这个问题的新读者,我强烈建议不要使用SimpoleDateFormat。它是一个臭名昭著的麻烦制造者类。请使用来自java.time,现代Java日期和时间API的类。 - Ole V.V.
显示剩余3条评论
8个回答

7

因为Date存储自1970年1月1日以来的毫秒数,所以您无法获得微秒。对于毫秒,请使用javadoc中记录的S


那么,你认为微秒不存在是如此显而易见吗? - lolo
这并不是显而易见的,这就是为什么我在我的回答中进行了解释。如果你阅读文档,那么它就非常清晰明了。你读过文档吗? - JB Nizet
@lolo - 根据JB Nizet链接页面上第一个表格中"Millisecond"的表示方式?是的,我也这么认为。 - Dawood ibn Kareem
如果SimpleDateFormat有获取微秒的方法,它肯定会在那个表格里。 - Dawood ibn Kareem

6

要获取微秒时间,唯一的方法是自己解析字符串。注意: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

如果您需要纳秒级的时间记录,您可以采取类似的方法。

嗨Peter,我知道这个问题不是主题,但我很好奇为什么YEARS_TO_MINUTES_SDF被同步了。 - Mahesh
@Mahesh SimpleDateFormat 不是线程安全的。通常情况下,它在没有同步的情况下工作得很好,但偶尔会出现损坏值,因为它具有可变字段。 - Peter Lawrey

3

您可以尽力做到以下最佳实践:

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

1
你只能显示毫秒::SS

1
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
public class MyClass
{
    public static void main(String args[]) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss:SSSSS");
        for(int i=0; i<=5;i++) {
            System.out.println("Class 1 : " + ZonedDateTime.now().format(formatter));
        }
    }
}

示例输出:

Class 1 : 19:25:19:77336
Class 1 : 19:25:19:77483
Class 1 : 19:25:19:77487
Class 1 : 19:25:19:77490
Class 1 : 19:25:19:77493
Class 1 : 19:25:19:77496

0

查看 SimpleDateFormat 的 Java-doc,它告诉我们:

毫秒:S

微秒不可用。


0
一般来说,毫秒的表示方式是用大写字母S,并且在你的情况下应该为yyyy-MM-dd HH:mm:ss:SSS。欲了解更多信息,请参考自定义格式

0

这个示例获取毫秒。微秒不可用。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接