我尝试这样做:
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 分钟。
链接
- Oracle tutorial: Date Time解释如何使用
java.time
。 - Java Specification Request (JSR) 310 ,其中首次描述了 java.time。
- ThreeTen Backport project ,
java.time
到 Java 6 和 7 的向后移植(对于 JSR-310 为 ThreeTen)。 - ThreeTenABP , Android 版 ThreeTen Backport
- Question: How to use ThreeTenABP in Android Project ,有非常详尽的解释。
关于date - 如何将毫秒转换为天、小时、分钟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49881667/