Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Date 如何将毫秒转换为天、小时、分钟_Date_Time_Minecraft_Bukkit_Milliseconds - Fatal编程技术网

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

Date 如何将毫秒转换为天、小时、分钟,date,time,minecraft,bukkit,milliseconds,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 'minu

我试着这样做:

        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);
但是当它向玩家(顺便说一句,minecraft)发送字符串消息时,小时和天从1开始,而分钟从0开始,例如,当某人刚刚加入他的游戏时,时间将是01天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天17小时08分

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

Java 6、7或8 我使用的
toxxpart
方法是在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);
结果与上述相同

问题:在Java6或Java7中如何工作? 我使用的
Duration
类是现代java日期和时间API
java.time
的一部分

  • 在Java8和更高版本中,以及在更新的Android设备上(我听说是从API级别26开始)
    Java.time
    是内置的
  • 在Java6和Java7中,获取三个后端口,即新类的后端口(三个用于JSR310;请参阅底部的链接)
  • 在(较旧的)Android上使用Android版本的ThreeTen Backport。它叫ThreeTenABP。并确保从带有子包的
    org.threeten.bp
    导入日期和时间类
你的代码出了什么问题? 为什么时间从1开始(不是0):这是你的时区。当你用毫秒创建一个
日期
时,你会得到一个时间点,即1970年1月1日00:00 UTC定义的纪元之后的许多毫秒(从概念上讲,当问题是玩家何时加入时,这是相当误导的)。如果您所在的时区在1970年冬季比UTC早1小时(例如,像中欧时间),则在该纪元已经是1点钟了,因此从那时开始计算小时数

因为是1月1日,这一天当然是1。奇怪的是,如果你在格林尼治标准时间以西的一个时区(举一个例子,美国/洛杉矶),日期仍然是1969年12月31日,也就是纪元后的第一个小时,因此新加入的玩家可能在那里呆了31天16小时00分钟

链接
  • 解释如何使用
    java.time
  • ,其中首先描述了
    java.time
  • ,java.time的后端口到Java6和Java7(JSR-310为三十)
  • ,Android版Three Ten Backport
  • ,解释得非常透彻

此问题和类似问题可能重复的问题已经被询问和回答了很多次,因此我建议您使用搜索引擎查找您喜欢的答案。或者可能重复的问题,我建议您避免使用
SimpleDateFormat
类。它不仅早已过时,而且还出了名的麻烦。今天我们在中有了更好的内容。非常感谢您的详细解释,它是有效的。我会注意到Minecraft(问题标记为)仍然不在Java9上,但这是一个非常好的一般性答案。