我试着这样做:
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分。有解决方案吗感谢
答案 0 :(得分:4)
让我们首先声明一些有用的常量。
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)可能已被宣布为常数。如果是的话,拿一个而不是声明自己的。
我使用的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);
结果与上述相同。
我正在使用的Duration
类是java.time
的一部分,现代Java日期和时间API
java.time
是内置的。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分钟。
java.time
。java.time
。java.time
向Java 6和7的后端(JST-310的ThreeTen)。