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

标签 date time minecraft bukkit milliseconds

我尝试这样做:

        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 小时 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 方法是在 Java 9 中引入的。如果没有它们,我们需要像这样计算各个部分:

    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 中如何工作?

我使用的 Duration 类是现代 Java 日期和时间 API java.time 的一部分

  • 在 Java 8 及更高版本以及较新的 Android 设备(据我所知,从 API 级别 26 开始)中,java.time 是内置的。
  • 在 Java 6 和 7 中获取 ThreeTen Backport,即新类的向后移植(ThreeTen for JSR 310;请参阅底部的链接)。
  • 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保使用子包从 org. Threeten.bp 导入日期和时间类。

您的代码出了什么问题?

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

由于是 1 月 1 日,所以当然被指定为 1。奇怪的是,如果您位于 GMT 以西的时区(仅举一个例子,即美国/洛杉矶),那么在新纪元后的最初几个小时内,日期仍然是 1969 年 12 月 31 日,因此新加入的玩家可能会出现例如,已在那里呆了 31 天 16 小时 00 分钟。

链接

关于date - 如何将毫秒转换为天、小时、分钟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49881667/

相关文章:

ruby-on-rails - 使用多种可接受的格式验证 Ruby 中的日期字符串?

date - 无法在 Eclipselink 上合并日期

shell - 如何在powershell中更轻松地操纵时间跨度

javascript - jQuery 数据表列 sum() of hh :mm:ss

java - 如何在另一个java程序中运行java程序

mysql - 显示特定日期的数据?

mysql - 计算流量计费的计费周期

algorithm - 计算循环的运行时间

java - Spigot 服务器未写入配置文件

http - 将 HTTP 和游戏服务器流量分离到同一地址