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

Lem*_*nio 124 java time date milliseconds

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

例如,我有这段代码.

Date date2 = new Date(); 
Long time2 = (long) (((((date2.getHours() * 60) + date2.getMinutes())* 60 ) + date2.getSeconds()) * 1000);
Run Code Online (Sandbox Code Playgroud)

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

注意: System.currentTimeMillis()从我所寻找的不是我的时代给我毫升.

Pet*_*rey 195

你的意思是?

long millis = System.currentTimeMillis() % 1000;
Run Code Online (Sandbox Code Playgroud)

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

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

  • Java不支持时间旅行. (34认同)
  • 请注意,如果您在Unix时期之前回到过去,这将给出负值,而使用`c.get(Calendar.MILLISECOND)`则不应该.总是想到角落的情况! (8认同)

Mar*_*nen 24

使用日历

Calendar.getInstance().get(Calendar.MILLISECOND);
Run Code Online (Sandbox Code Playgroud)

要么

Calendar c=Calendar.getInstance();
c.setTime(new Date()); /* whatever*/
//c.setTimeZone(...); if necessary
c.get(Calendar.MILLISECOND);
Run Code Online (Sandbox Code Playgroud)

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


kga*_*ron 16

Calendar.getInstance().get(Calendar.MILLISECOND);
Run Code Online (Sandbox Code Playgroud)


小智 12

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

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

long millisStart = Calendar.getInstance().getTimeInMillis();
Run Code Online (Sandbox Code Playgroud)

如果需要,然后在结束时间做同样的事情.


Bas*_*que 11

TL;博士

你要求当前时间的一小部分为几毫秒(从纪元算起).

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

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

  1. 以纳秒为单位获得小数秒(数十亿).
  2. 除以千来截断到毫秒(数千).

请参阅IdeOne.com上的代码.

使用java.time

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

捕获UTC中的当前时刻.

Instant.now()
Run Code Online (Sandbox Code Playgroud)

使用该Instant.get方法查询a的值TemporalField.在我们的例子中,TemporalField我们想要的是ChronoField.MILLI_OF_SECOND.

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

或者自己做数学.

您更有可能在特定时区询问此问题.一秒钟的分数很可能与之相同,Instant但是时区有很多异常现象,我犹豫不决.

ZonedDateTime zdt = ZonedDateTime.now( ZoneId.of( "America/Montreal" ) ) ;
Run Code Online (Sandbox Code Playgroud)

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

long nanosFractionOfSecond = zdt.getNano();
Run Code Online (Sandbox Code Playgroud)

如果你真的想要毫秒,则通过除以一百万来截断更精细的数据.例如,半秒是500,000,000纳秒并且也是500毫秒.

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

关于java.time

java.time框架是建立在Java 8和更高版本.这些类取代麻烦的老传统日期时间类,如java.util.Date,Calendar,和SimpleDateFormat.

现在处于维护模式Joda-Time项目建议迁移到java.time类.

要了解更多信息,请参阅Oracle教程.并搜索Stack Overflow以获取许多示例和解释.规范是JSR 310.

从哪里获取java.time类?

ThreeTen-额外项目与其他类扩展java.time.该项目是未来可能添加到java.time的试验场.您可以在此比如找到一些有用的类Interval,YearWeek,YearQuarter,和更多.


oma*_*rez 5

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

2014 年 4 月 4 日星期五 14:27:05 PDT