【问题标题】:How do I convert milliseconds to days, hour, minutes如何将毫秒转换为天、小时、分钟
【发布时间】:2018-04-17 15:08:39
【问题描述】:

我尝试过这样做:

        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 min。有什么解决办法吗?谢谢

【问题讨论】:

标签: date time minecraft bukkit milliseconds


【解决方案1】:

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 天 17 小时 08 分钟

可能每秒的滴答数(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,即新类的后向端口(对于 JSR 310,ThreeTen;请参阅底部的链接)。
  • 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保从 org.threeten.bp 导入日期和时间类以及子包。

你的代码出了什么问题?

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

因为是 1 月 1 日,所以 day 当然是 1。奇怪的是,如果你在格林威治标准时间以西的时区(仅举一个例子是美国/洛杉矶),那么在纪元后的头几个小时内,日期仍然是 1969 年 12 月 31 日,所以新加入的玩家可能看起来像例如,已经在那里呆了 31 天 16 小时 00 分钟。

链接

【讨论】:

  • 非常感谢您的详细解释,成功了
  • 我会注意到 Minecraft(问题被标记为)仍然不在 Java 9 上,但这是一个非常好的一般答案。
猜你喜欢
  • 2012-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-16
  • 1970-01-01
  • 2012-01-06
  • 2017-05-10
相关资源
最近更新 更多