如何将毫秒转换为天、小时、分钟

How do I convert milliseconds to days, hour, minutes

我试过这样做:

        long Plptime = player.getStatistic(Statistic.PLAY_ONE_TICK)*50L; //from ticks to ms(1 tick (20 each sec) by 50 gives aprox the ms)

        SimpleDateFormat formatter = new SimpleDateFormat("dd 'days,' HH 
        'hours and' mm 'minutes'", Locale.getDefault());

        Date date = new Date(Plptime);
        String result1 = formatter.format(date);

但是当它向玩家(顺便说一下我的世界)发送字符串消息时,小时和天从 1 开始,而分钟从 0 开始,例如,当某人刚加入他的游戏时间时,时间将是 01days 01 hours 00分钟。任何解决方案?谢谢

Java 9 或更高版本

让我们首先声明几个有用的常量。

private static final int TICKS_PER_SECOND = 20;
public static final Duration ONE_TICK = Duration.ofSeconds(1).dividedBy(TICKS_PER_SECOND);

现在做:

    int ticks = player.getStatistic(Statistic.PLAY_ONE_TICK);
    Duration plpTime = ONE_TICK.multipliedBy(ticks);
    String result1 = String.format(Locale.ENGLISH, "%02d days %02d hours and %02d minutes",
            plpTime.toDays(), plpTime.toHoursPart(), plpTime.toMinutesPart());

    System.out.println(result1);

这将打印一个字符串,如

00 days 17 hours and 08 minutes

可能每秒滴答数 (20) 已经在 Bukkit 的某处声明为常量,我不知道。如果是,那就拿那个来声明你自己的吧。

Java 6、7 或 8

我使用的toXxxPart方法是在Java9中介绍的,没有它们我们需要像这样计算各个部分:

    long days = plpTime.toDays();
    plpTime = plpTime.minusDays(days);
    long hours = plpTime.toHours();
    plpTime = plpTime.minusHours(hours);
    long minutes = plpTime.toMinutes();
    String result1 = String.format(Locale.ENGLISH, "%02d days %02d hours and %02d minutes",
            days, hours, minutes);

结果同上

问题:如何在 Java 6 或 7 中工作?

我用的Durationclass是java.time的一部分,现代Java日期和时间API

  • 在 Java 8 及更高版本和较新的 Android 设备上(据我所知,来自 API 级别 26)java.time 是内置的。
  • 在 Java 6 和 7 中获取 ThreeTen Backport,新 classes 的 backport(ThreeTen 用于 JSR 310;请参阅底部的链接)。
  • 在(较旧的)Android 使用 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP。并确保使用子包从 org.threeten.bp 导入日期和时间 classes。

你的代码出了什么问题?

为什么 小时 似乎从 1(而不是 0)开始:这是您所在的时区。当您从毫秒创建 Date 时,您会在 1970 年 1 月 1 日定义为 00:00 UTC 的纪元之后许多毫秒的时间点(当问题是什么时候,这在概念上是非常误导的玩家加入)。如果您所在的时区在 1970 年冬天比 UTC 早 1 小时(例如中欧时间),则此时已经是 1 点钟,因此小时数从那里开始计算。

因为是 1 月 1 日,所以 当然是 1。奇怪的是,如果你在格林威治标准时间以西的时区(America/Los_Angeles 仅举一个例子),日期在纪元后的前几个小时仍然是 1969 年 12 月 31 日,所以新加入的玩家可能例如,似乎已经在那里待了 31 天 16 小时 00 分钟。

链接