如何获得当前午夜以来的毫秒数?

时间:2012-08-02 20:26:20

标签: java date time milliseconds

注意,我不希望毫米来自时代。我想要当前时钟的毫秒数。

例如,我有这段代码。

Date date2 = new Date(); 
Long time2 = (long) (((((date2.getHours() * 60) + date2.getMinutes())* 60 ) + date2.getSeconds()) * 1000);

有没有办法让日期达到毫秒? 还有另一种方法吗?

注意: System.currentTimeMillis()给了我一个不是我正在寻找的时代的毫秒。

10 个答案:

答案 0 :(得分:191)

你的意思是?

long millis = System.currentTimeMillis() % 1000;

BTW Windows不允许时间旅行到1969年

C:\> date
Enter the new date: (dd-mm-yy) 2/8/1969
The system cannot accept the date entered.

答案 1 :(得分:24)

使用日历

Calendar.getInstance().get(Calendar.MILLISECOND);

Calendar c=Calendar.getInstance();
c.setTime(new Date()); /* whatever*/
//c.setTimeZone(...); if necessary
c.get(Calendar.MILLISECOND);

在实践中虽然我认为它几乎总是等于System.currentTimeMillis()%1000;除非某人有跳跃毫秒或某个日历定义的时间不在第二个边界上。

答案 2 :(得分:16)

Calendar.getInstance().get(Calendar.MILLISECOND);

答案 3 :(得分:12)

我尝试了上面几个,但他们似乎重置了@ 1000

这个肯定有用,也应该花一年时间考虑

long millisStart = Calendar.getInstance().getTimeInMillis();

然后根据需要为结束时间做同样的事情。

答案 4 :(得分:8)

TL;博士

您要求当前时间的一小部分为毫秒(不是从纪元开始计数)。

Instant.now()                               // Get current moment in UTC, then…
       .get( ChronoField.MILLI_OF_SECOND )  // interrogate a `TemporalField`.
  

2017-04-25T03:01:14.113Z→113

  1. 以纳秒为单位获得小数秒(数十亿)。
  2. 除以千来截断到毫秒(数千)。
  3. 请参阅此code run live at IdeOne.com

    使用java.time

    现代的方法是使用java.time类。

    以UTC格式捕获当前时刻。

    Instant.now()
    

    使用Instant.get方法查询TemporalField的值。在我们的例子中,我们想要的TemporalFieldChronoField.MILLI_OF_SECOND

    int millis = Instant.now().get( ChronoField.MILLI_OF_SECOND ) ;  // Get current moment in UTC, then interrogate a `TemporalField`.
    

    或者自己做数学。

    您更有可能在特定时区询问此问题。一秒的分数很可能与Instant相同,但是时区有很多异常,我不愿做出这样的假设。

    ZonedDateTime zdt = ZonedDateTime.now( ZoneId.of( "America/Montreal" ) ) ;
    

    询问小数秒。该问题要求milliseconds,但java.time类使用更精细的nanoseconds分辨率。这意味着纳秒的数量范围为0到999,999,999。

    long nanosFractionOfSecond = zdt.getNano();
    

    如果您真的需要毫秒,请将更精细的数据除以一百万。例如,半秒是500,000,000纳秒,也是500毫秒。

    long millis = ( nanosFractionOfSecond / 1_000_000L ) ;  // Truncate nanoseconds to milliseconds, by a factor of one million.
    

    关于java.time

    java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

    现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

    要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

    从哪里获取java.time类?

    ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 5 :(得分:4)

  1. long timeNow = System.currentTimeMillis();
  2. System.out.println(new Date(timeNow));
  3.   

    Fri Apr 04 14:27:05 PDT 2014

答案 6 :(得分:2)

约达时间

我认为您可以使用Joda-Time来执行此操作。查看DateTime类及其getMillisOfSecond方法。像

这样的东西
int ms = new DateTime().getMillisOfSecond() ;

答案 7 :(得分:0)

在Java 8中,您只需执行

ZonedDateTime.now().toInstant().toEpochMilli()
  

返回:   自1970-01-01T00:00:00Z

以来的毫秒数

答案 8 :(得分:0)

我使用java 8进行了测试 它不会影响构造器总是需要0毫秒的顺序,以及在1000和串联的迭代下的26和33毫秒之间的连续

希望它可以帮助您尝试使用您的ide

public void count() {

        String result = "";

        StringBuilder builder = new StringBuilder();

        long millis1 = System.currentTimeMillis(),
            millis2;

        for (int i = 0; i < 1000; i++) {
            builder.append("hello world this is the concat vs builder test enjoy");
        }

        millis2 = System.currentTimeMillis();

        System.out.println("Diff: " + (millis2 - millis1));

        millis1 = System.currentTimeMillis();

        for (int i = 0; i < 1000; i++) {
            result += "hello world this is the concat vs builder test enjoy";
        }

        millis2 = System.currentTimeMillis();

        System.out.println("Diff: " + (millis2 - millis1));
    }

答案 9 :(得分:0)

您可以使用java.util.Calendar类来获取时间(以毫秒为单位)。 示例:

Calendar cal = Calendar.getInstance();
int milliSec = cal.get(Calendar.MILLISECOND);
// print milliSec

java.util.Date date = cal.getTime();
System.out.println("Output: " +  new SimpleDateFormat("yyyy/MM/dd-HH:mm:ss:SSS").format(date));