Java 毫秒到天

Java 毫秒到天,java,math,time,milliseconds,Java,Math,Time,Milliseconds,我做了一些研究,但仍然找不到如何得到这些天。。。以下是我得到的: int seconds = (int) (milliseconds / 1000) % 60 ; int minutes = (int) ((milliseconds / (1000*60)) % 60); int hours = (int) ((milliseconds / (1000*60*60)) % 24); int days = ????? ; 请帮帮我,我数学不好,谢谢。如果你没有超过天的时间间隔: int da

我做了一些研究,但仍然找不到如何得到这些天。。。以下是我得到的:

int seconds = (int) (milliseconds / 1000) % 60 ;
int minutes = (int) ((milliseconds / (1000*60)) % 60);
int hours   = (int) ((milliseconds / (1000*60*60)) % 24);
int days = ????? ;

请帮帮我,我数学不好,谢谢。

如果你没有超过天的时间间隔:

int days = (int) (milliseconds / (1000*60*60*24));
如果你也有几个星期:

int days = (int) ((milliseconds / (1000*60*60*24)) % 7);
int weeks = (int) (milliseconds / (1000*60*60*24*7));

如果可能的话,最好避免使用月份和年份,因为它们没有明确定义的固定长度。严格来说,白天也不例外:夏时制意味着白天的长度不能超过24小时。

对于这样的简单情况,应该使用。与显式执行所有算术计算相比,时间单位的使用更明确地描述了所表示的内容,也更易于读取和写入。例如,要从毫秒计算天数,可以使用以下语句:

int days = (int) (milliseconds / 86 400 000 )
    long days = TimeUnit.MILLISECONDS.toDays(milliseconds);
对于更高级的情况,如果需要在使用时间的上下文中表示更细粒度的持续时间,则应使用全面的现代日期/时间API。对于JDK8+,现在包括java.time(以下是和)。对于早期版本的Java来说,这是一个可靠的选择

public static final long SECOND_IN_MILLIS = 1000;
public static final long MINUTE_IN_MILLIS = SECOND_IN_MILLIS * 60;
public static final long HOUR_IN_MILLIS = MINUTE_IN_MILLIS * 60;
public static final long DAY_IN_MILLIS = HOUR_IN_MILLIS * 24;
public static final long WEEK_IN_MILLIS = DAY_IN_MILLIS * 7;

您可以强制转换int,但我建议使用long.

以解决在代码中记录执行统计信息的更复杂任务:

public void logExecutionMillis(LocalDateTime start, String callerMethodName) {

  LocalDateTime end = getNow();
  long difference = Duration.between(start, end).toMillis();

  Logger logger = LoggerFactory.getLogger(ProfilerInterceptor.class);

  long millisInDay = 1000 * 60 * 60 * 24;
  long millisInHour = 1000 * 60 * 60;
  long millisInMinute = 1000 * 60;
  long millisInSecond = 1000;

  long days = difference / millisInDay;
  long daysDivisionResidueMillis = difference - days * millisInDay;

  long hours = daysDivisionResidueMillis / millisInHour;
  long hoursDivisionResidueMillis = daysDivisionResidueMillis - hours * millisInHour;

  long minutes = hoursDivisionResidueMillis / millisInMinute;
  long minutesDivisionResidueMillis = hoursDivisionResidueMillis - minutes * millisInMinute;

  long seconds = minutesDivisionResidueMillis / millisInSecond;
  long secondsDivisionResidueMillis = minutesDivisionResidueMillis - seconds * millisInSecond;

  logger.info(
      "\n************************************************************************\n"
          + callerMethodName
          + "() - "
          + difference
          + " millis ("
          + days
          + " d. "
          + hours
          + " h. "
          + minutes
          + " min. "
          + seconds
          + " sec."
          + secondsDivisionResidueMillis
          + " millis).");
}

如果愿意,可以用简单的System.out.println()替换p.S.记录器。

在java中选择时间单位

为了导入使用,java.util.concurrent.TimeUnit

long millisec=System.currentTimeMillis();
long seconds=TimeUnit.MILLISECONDS.toSeconds(millisec);
long minutes=TimeUnit.MILLISECONDS.toMinutes(millisec);
long hours=TimeUnit.MILLISECONDS.toMinutes(millisec);
long days=TimeUnit.MILLISECONDS.toDays(millisec);
java.time 您可以使用它,它是Java-8的一部分。使用Java-9介绍了一些更方便的方法

演示:

import java.time.Duration;

public class Main {
    public static void main(String[] args) {
        // Duration between the two instants
        Duration duration = Duration.ofMillis(1234567890L);

        // Print Duration#toString
        System.out.println(duration);

        // Custom format
        // ####################################Java-8####################################
        String formattedElapsedTime = String.format(
                "%d Day %02d Hour %02d Minute %02d Second %d Millisecond (%d Nanosecond)", duration.toDays(),
                duration.toHours() % 24, duration.toMinutes() % 60, duration.toSeconds() % 60,
                duration.toMillis() % 1000, duration.toNanos() % 1000000000L);
        System.out.println(formattedElapsedTime);
        // ##############################################################################

        // ####################################Java-9####################################
        formattedElapsedTime = String.format("%d Day %02d Hour %02d Minute %02d Second %d Millisecond (%d Nanosecond)",
                duration.toDaysPart(), duration.toHoursPart(), duration.toMinutesPart(), duration.toSecondsPart(),
                duration.toMillisPart(), duration.toNanosPart());
        System.out.println(formattedElapsedTime);
        // ##############################################################################
    }
}
PT342H56M7.89S
14 Day 06 Hour 56 Minute 07 Second 890 Millisecond (890000000 Nanosecond)
14 Day 06 Hour 56 Minute 07 Second 890 Millisecond (890000000 Nanosecond)
运行示例:

import java.time.Duration;

public class Main {
    public static void main(String[] args) {
        // Duration between the two instants
        Duration duration = Duration.ofMillis(1234567890L);

        // Print Duration#toString
        System.out.println(duration);

        // Custom format
        // ####################################Java-8####################################
        String formattedElapsedTime = String.format(
                "%d Day %02d Hour %02d Minute %02d Second %d Millisecond (%d Nanosecond)", duration.toDays(),
                duration.toHours() % 24, duration.toMinutes() % 60, duration.toSeconds() % 60,
                duration.toMillis() % 1000, duration.toNanos() % 1000000000L);
        System.out.println(formattedElapsedTime);
        // ##############################################################################

        // ####################################Java-9####################################
        formattedElapsedTime = String.format("%d Day %02d Hour %02d Minute %02d Second %d Millisecond (%d Nanosecond)",
                duration.toDaysPart(), duration.toHoursPart(), duration.toMinutesPart(), duration.toSecondsPart(),
                duration.toMillisPart(), duration.toNanosPart());
        System.out.println(formattedElapsedTime);
        // ##############################################################################
    }
}
PT342H56M7.89S
14 Day 06 Hour 56 Minute 07 Second 890 Millisecond (890000000 Nanosecond)
14 Day 06 Hour 56 Minute 07 Second 890 Millisecond (890000000 Nanosecond)

了解有关现代日期时间API的更多信息。很抱歉或者更准确地说:如果你知道时区和开始时间(或结束时间),你可以。一天的长度可能是23小时、24小时、25小时或其他长度。因此,没有任何可靠的公式可以将毫秒转换为天。因此,虽然您可以安全地依赖于每秒1000毫秒、每分钟60秒(以下是预约)和每小时60分钟,但转换为天需要更多的上下文才能确保准确

保留:在现实生活中,一分钟有时是61秒,因为闰秒。不是用Java。Java总是将一分钟计算为60秒,因为普通的计算机时钟不知道闰秒。普通操作系统和Java本身不仅知道夏季时间(DST),还知道许多其他导致一天短于或长于24小时的时间线异常

证明。我写这篇文章的时间是2021年3月29日,也就是我所在时区欧洲/哥本哈根和其他欧盟国家切换到夏季的第二天

    ZoneId myTimeZone = ZoneId.of("Europe/Copenhagen");
    ZonedDateTime now = ZonedDateTime.now(myTimeZone);
    ZonedDateTime twoDaysAgo = now.minusDays(2);
    ZonedDateTime inTwoDays = now.plusDays(2);
    
    System.out.println(ChronoUnit.MILLIS.between(twoDaysAgo, now));
    System.out.println(ChronoUnit.MILLIS.between(now, inTwoDays));
输出:

所以两天有多少毫秒取决于你指的是哪两天。在哪个时区

那怎么办呢

  • 如果出于您的目的,您可以安全地将一天定义为始终24小时,例如,因为您的天是以UTC计算的,或者您的用户对不准确无所谓,请使用
    持续时间
    时间单位
    。自从Java 9以来,
    Duration
    类还将告诉您除了整天之外还有多少小时、分钟和秒。请参阅Arvind Kumar Avinash的答案。有关
    时间单位
    枚举,请参阅whaley和Dev Parzival的答案。不管怎样,好消息是,如果你数学不好,那也没关系,因为数学是为你准备的

    ZonedDateTime start = LocalDate.of(2021, Month.MARCH, 28).atStartOfDay(myTimeZone);
    long millisToConvert = 170_000_000;
    
    ZonedDateTime end = start.plus(millisToConvert, ChronoUnit.MILLIS);
    long days = ChronoUnit.DAYS.between(start, end);
    System.out.format("%d days%n", days);
    
  • 如果您知道时区和起点,请使用
    zoneDateTime
    ChronoUnit.DAYS
    。在这种情况下,数学也会为您处理

    ZonedDateTime start = LocalDate.of(2021, Month.MARCH, 28).atStartOfDay(myTimeZone);
    long millisToConvert = 170_000_000;
    
    ZonedDateTime end = start.plus(millisToConvert, ChronoUnit.MILLIS);
    long days = ChronoUnit.DAYS.between(start, end);
    System.out.format("%d days%n", days);
    
  • 如果您还需要小时、分钟和秒:

        Duration remainingTime = Duration.between(start.plusDays(days), end);
        System.out.format(" - and an additional %s hours %d minutes %d seconds%n",
                remainingTime.toHours(),
                remainingTime.toMinutesPart(),
                remainingTime.toSecondsPart());
    
    如果您得到了一个端点,则使用
    方法(而不是上述代码中使用的
    方法)从端点减去毫秒以获得起点


    在任何情况下,都不能像问题和当前接受的答案那样自己做数学题。它容易出错,导致代码难以阅读。如果你的读者数学不好,他或她可以花很多宝贵的开发人员时间来验证你是否做得正确。把数学留给经过验证的库方法,读者就更容易相信代码是正确的。

    from:86400000(24×60×60×10×10×10)毫秒-一天不要忘记夏令时changes@MarkRotteveel大约10年后,我发布了你的重要评论。如果你使用Android,这需要API级别9的时间单位将无法正确舍入。因此129600000l,即1.5天,将返回1,而不是2。这可能取决于具体情况下舍入的正确定义。我最初的回答只是针对原始问题中的简单情况。对于更复杂的情况,例如精确表示1.5天,我建议使用JDK8+中的java.time或joda time(如果您使用的是较旧的java版本)。我将修改我的回答,提出这一点。