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

时间:2018-04-17 15:08:40

标签: 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开始,例如当有人加入他的游戏时间时将是01天01小时00分。有解决方案吗感谢

1 个答案:

答案 0 :(得分:4)

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

我不知道,在Bukkit的某个地方,每秒钟数(20)可能已被宣布为常数。如果是的话,拿一个而不是声明自己的。

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.time的一部分,现代Java日期和时间API

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

您的代码出了什么问题?

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

由于是1月1日,当然是1。奇怪的是,如果你曾经在格林威治标准时间以西的某个时区(美国/洛杉矶安吉莱斯只给出一个例子),那么日期仍然是1969年12月31日这个时代之后的头几个小时,所以新加入的玩家可能看起来像例如,已经在那里工作了31天,16小时和00分钟。

链接