如何通过Java找到午夜过去的秒数?

时间:2010-12-08 16:00:06

标签: java time

我需要一个能让我从午夜过去几秒钟的功能。我目前正在使用System.currentTimeMillis(),但它给了我像时间戳的UNIX。

如果我也可以获得毫秒数,对我来说将是一个奖励。

8 个答案:

答案 0 :(得分:61)

如果你使用Java> = 8,这很容易做到:

ZonedDateTime now = ZonedDateTime.now();
ZonedDateTime midnight = now.atStartOfDay();
Duration duration = Duration.between(midnight, now);
long secondsPassed = duration.getSeconds();

如果您使用的是Java 7或更低版​​本,则必须通过日历从午夜获取日期,然后减去。

Calendar c = Calendar.getInstance();
long now = c.getTimeInMillis();
c.set(Calendar.HOUR_OF_DAY, 0);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
c.set(Calendar.MILLISECOND, 0);
long passed = now - c.getTimeInMillis();
long secondsPassed = passed / 1000;

答案 1 :(得分:5)

java.time

使用Java 8及更高版本中内置的java.time框架。请参阅Tutorial

import java.time.LocalTime
import java.time.ZoneId

LocalTime now = LocalTime.now(ZoneId.systemDefault()) // LocalTime = 14:42:43.062
now.toSecondOfDay() // Int = 52963

最好明确指定ZoneId,即使您需要默认值。

答案 2 :(得分:4)

TL;博士

Duration.between( todayStart , now )
        .getSeconds()

java.time

Java 8及更高版本在其中编译了java.time框架。

通过使用ZonedDateTime和时区,我们正在处理Daylight Saving Time (DST)等异常情况。例如,在美国一天可以是23,24或25小时长。所以直到明天的时间从一天到另一天可能会有±1小时的变化。

首先得到当前时刻。

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

现在提取仅限日期的部分LocalDate,并使用该日期在我们所需时区的那天开始时询问java.time。不要假设这一天从00:00:00开始。夏令时(DST)等异常意味着该日可能会在另一个时间开始,例如01:00:00。

ZonedDateTime todayStart = now.toLocalDate().atStartOfDay( z );  // Crucial to specify our desired time zone!

现在我们可以获得当前时刻和今天开始之间的增量。这种与时间线无关的时间跨度由Duration类表示。

Duration duration = Duration.between( todayStart , now );

Duration对象询问整个时间段内的总秒数。

long secondsSoFarToday = duration.getSeconds();

关于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

答案 3 :(得分:2)

获取当前时区午夜以来秒数的最简单,最快捷的方法:

一次性设置:

static final long utcOffset = TimeZone.getDefault().getOffset(System.currentTimeMillis());

如果你使用Apache Commons,你可以使用DateUtils.DAY_IN_MILLIS,否则定义:

static final long DAY_IN_MILLIS = 24 * 60 * 60 * 1000;

然后,只要你需要时间......:

int seconds = (int)((System.currentTimeMillis() + utcOffset) % DateUtils.DAY_IN_MILLIS / 1000);

请注意,如果您的程序可能运行得足够长,并且夏令时发生变化,则需要重新设置...

答案 4 :(得分:1)

使用JodaTime,您可以致电:

int seconds = DateTime.now().secondOfDay().get();
int millis = DateTime.now().millisOfDay().get();

答案 5 :(得分:1)

如果收到有关受保护日历的错误,请使用getTime()。getTime()而不是getTimeInMillis()。记住你的进口:

import java.util.*; 
在调试时,

将包含它们:

    Calendar now = Calendar.getInstance();
    Calendar midnight = Calendar.getInstance();
    midnight.set(Calendar.HOUR_OF_DAY, 0);
    midnight.set(Calendar.MINUTE, 0);
    midnight.set(Calendar.SECOND, 0);
    midnight.set(Calendar.MILLISECOND, 0);
    long ms = now.getTime().getTime() - midnight.getTime().getTime();
    totalMinutesSinceMidnight = (int) (ms / 1000 / 60);

答案 6 :(得分:0)

(System.currentTimeMillis()/1000) % (24 * 60 * 60)

答案 7 :(得分:-1)

与@secmask一样,如果您需要自格林威治标准时间午夜以来的毫秒,请尝试

long millisSinceGMTMidnight = System.currentTimeMillis() % (24*60*60*1000);