如何计算从午夜到现在的毫秒数?

注意,我不希望从纪元毫秒。我想要的数目毫秒当前的时钟。

例如,我有这段代码。

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

有什么方法可以得到毫秒的日期吗? 还有别的办法吗?

注意: System.currentTimeMillis()给了我来自时代的毫米,这不是我想要的。

403027 次浏览

你的意思是?

long millis = System.currentTimeMillis() % 1000;

顺便说一句,视窗不允许时间旅行到1969年

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

使用日历

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; 除非有人有闰秒,或者某个日历定义了一个不在第二边界上的纪元。

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

Joda 时间

我想你可以用 Joda 时间来做这个。看看 DateTime类及其 getMillisOfSecond方法。差不多

int ms = new DateTime().getMillisOfSecond() ;
  1. long timeNow = System.currentTimeMillis();
  2. System.out.println(new Date(timeNow));

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

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

这个方法绝对有效,而且应该考虑到年份

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

如果需要的话,在结束时也这样做。

在 Java8中,您可以简单地执行

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

报税表: 自1970-01-01时代以来的毫秒数

博士

您要求将当前时间的分数以毫秒为单位(从纪元开始计算 没有)。

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

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

  1. 得到纳秒(十亿)的分数秒。
  2. 除以1000截断为毫秒(千)。

看这个 代码在 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" ) ) ;

审问分数秒。这个问题要求使用 毫秒,但 java.time 类使用更好的 纳秒分辨率。这意味着纳秒的数量将从0到999,999,999不等。

long nanosFractionOfSecond = zdt.getNano();

如果您确实需要毫秒,那么通过除以100万来截断更精细的数据。例如,半秒是500,000,000纳秒,也是500毫秒。

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

关于爪哇时间

爪哇时间框架内置于 Java8及更高版本中。这些类取代了令人讨厌的旧的 遗产日期时间类,如 java.util.DateCalendarSimpleDateFormat

现在在 维修模式中的 Joda 时间项目建议迁移到 爪哇时间类。

要了解更多,请参阅 Oracle 教程。并搜索堆栈溢出许多例子和解释。规范是 JSR 310

从哪里获得 java.time 类?

  • Java SE 8 SE9 及更高版本
    • 内置的。
    • 带有捆绑实现的标准 JavaAPI 的一部分。
    • Java9添加了一些次要的特性和修复。
  • Java SE 6 和 < a href = “ https://en.wikipedia.org/wiki/Java _ version _ history # Java _ SE _ 7”rel = “ noReferrer”> < strong > SE 7
  • 仿生人

310-号外项目使用其他类扩展 java.time。这个项目是将来可能添加 java.time 的试验场。您可以在这里找到一些有用的类,比如 IntervalYearWeekYearQuarter更多

我用 java 8做了测试 构建器总是需要0毫秒的顺序,以及在1000级连接的迭代下26到33毫秒之间的连接顺序并不重要

希望对你的想法有帮助

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));
}

爪哇8:

LocalDateTime toDate = LocalDateTime.now();
LocalDateTime fromDate = LocalDateTime.of(toDate.getYear(), toDate.getMonth(),
toDate.getDayOfMonth(), 0, 0, 0);
long millis = ChronoUnit.MILLIS.between(fromDate, toDate);

可以使用 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));