所以举个例子,我有这段代码。
Date date2 = new Date();
Long time2 = (long) (((((date2.getHours() * 60) + date2.getMinutes())* 60 ) + date2.getSeconds()) * 1000);
有没有一种方法可以获得日期的毫秒数? 还有其他的方法吗?
注意:System.currentTimeMillis() 给我提供了自纪元以来的毫秒数,这不是我要找的东西。
Date date2 = new Date();
Long time2 = (long) (((((date2.getHours() * 60) + date2.getMinutes())* 60 ) + date2.getSeconds()) * 1000);
你的意思是什么?
long millis = System.currentTimeMillis() % 1000;
顺便提一句,Windows不允许时间旅行到1969年。
C:\> date
Enter the new date: (dd-mm-yy) 2/8/1969
The system cannot accept the date entered.
c.get(Calendar.MILLISECOND)
则不应该出现这种情况。始终考虑边界情况! - Jon SkeetSystem.currentTimeMillis()
不受时区影响。 - Jon Skeet使用日历(Calendar)
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);
您需要将当前时间的一小部分表示为毫秒数(不是从纪元开始计算)。
Instant.now() // Get current moment in UTC, then…
.get( ChronoField.MILLI_OF_SECOND ) // interrogate a `TemporalField`.
2017-04-25T03:01:14.113Z →
113
现代方式是使用java.time类。
在UTC中捕获当前时刻。
Instant.now()
Instant.get
方法来查询TemporalField
的值。在我们的案例中,我们需要的TemporalField
是ChronoField.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();
long millis = ( nanosFractionOfSecond / 1_000_000L ) ; // Truncate nanoseconds to milliseconds, by a factor of one million.
java.time 框架是内置于 Java 8 及更高版本中的。这些类取代了老旧且麻烦的传统日期时间类,例如 java.util.Date
、Calendar
和 SimpleDateFormat
。
Joda-Time 项目现在处于维护模式,建议迁移到 java.time 类。
要了解更多,请参见Oracle教程。并在Stack Overflow上搜索许多示例和解释。规范是JSR 310。
如何获取java.time类?
Interval
、YearWeek
、YearQuarter
和 更多。请注意,保留 HTML 标签。我尝试了几个,但它们似乎会在1000处重置。
这一个绝对有效,并且应该考虑到年份。
long millisStart = Calendar.getInstance().getTimeInMillis();
如果需要的话,同样的方式处理结束时间。
1627732708315:1627732708315
- AKTanaralong timeNow = System.currentTimeMillis();
System.out.println(new Date(timeNow));
2014年4月4日 星期五 下午2:27:05
我认为你可以使用Joda-Time完成这个任务。看一下DateTime
类及其getMillisOfSecond
方法。例如:
int ms = new DateTime().getMillisOfSecond() ;
getMillis()
受保护访问权限”;需要使用 get()
。同时请注意,new DateTime(new Date())
等同于简单地编写 new DateTime()
。 - JonikmillisOfSecond
访问一个对象,随后调用 get
从该对象中提取一个基本类型的 int
。您可以使用方便的 getter 方法 getMillisOfSecond
来折叠这两个调用。Joda-Time 在其许多属性中遵循此模式。 - Basil Bourque我使用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));
}
ZonedDateTime.now().toInstant().toEpochMilli()
Instant.now().toEpochMilli()
- Basil BourqueCalendar 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));
java.util.Date
之类的老旧日期时间类现在已经成为遗留系统,被Java.time类所取代。请参阅Oracle教程。 - Basil Bourque