Joda 时间 - 无法以分钟为单位从 Period 计算月/年
Joda time - Not able to calculate months / years from Period in minutes
我在 Android Studio 项目中使用 joda-time-2.5。
我无法计算出我遗漏的内容,无法正确格式化具有 and/or 年 and/or 个月的字符串。
Period 计算正确 - 但不会超出 "Weeks" 例如。 1000000 分钟的格式正确为“99wks, 1day, 10hrs + 40mins”。但不是 months/years 格式,例如。 “1 年、10 个月、3 周、1 天、10 小时 + 40 分钟”等等
我试过各种变体
Period pA = new Period(mA);
Period pA = new Period(mA, PeriodType.standard());
Period pA = new Period(mA, PeriodType.yearMonthDay());
等,但这些没有区别。
我已经尝试了 adding/removing 各种 .appends/years/months/printZero
- 这没什么区别。
我试过更改期间单位:如果我使用月或年,它会起作用,例如
Months mA = Months.months(15);
Period pA = new Period(mA, PeriodType.standard());
正确生成“1 年,3 个月”。
我知道 'years' 和 'months' 不精确(在这种情况下近似值实际上没问题),但我认为这就是 PeriodTypes/yearMonthDay 或标准所处理的?
我也试过PeriodFormat.getDefault().print(period)
没成功。
请在下面找到代码:
private String formatTimeStr(int minutes){
Minutes mA = Minutes.minutes(minutes);
Period pA = new Period(mA);
PeriodFormatter dhm = new PeriodFormatterBuilder()
.printZeroNever()
.appendYears()
.appendSuffix("year","years")
.appendSeparator(", ")
.appendMonths()
.appendSuffix("mnth", "mnths")
.appendSeparator(", ")
.appendWeeks()
.appendSuffix("wk", "wks")
.appendSeparator(", ")
.appendDays()
.appendSuffix("day", "days")
.appendSeparator(", ")
.appendHours()
.appendSuffix("hr", "hrs")
.appendSeparator(" & ")
.appendMinutes()
.appendSuffix("min", "mins")
.toFormatter();
String formattedTimeStr = dhm.print(pA.normalizedStandard());
return formattedTimeStr;
}
事实上,正如您已经认识到的那样,分钟在严格意义上不能转换为月。 Joda-Time-documentation也说出来了
If the period contains years or months, then the months will be
normalized to be between 0 and 11. The days field and below will be
normalized as necessary, however this will not overflow into the
months field. Thus a period of 1 year 15 months will normalize to 2
years 3 months. But a period of 1 month 40 days will remain as 1 month
40 days.
从技术上讲,有两种转换选项。
a) 您定义了一个参考时间戳。然后您可以执行以下操作:
LocalDateTime tsp1 = new LocalDateTime(); // now as example
LocalDateTime tsp2 = tsp1.plusMinutes(minutes);
Period p = new Period(tsp1, tsp2, PeriodType.standard()); // or other period type?
b) 您根据时间单位的估计长度 找到并开发了一种舍入算法。例如,您可能愿意接受 30.5 天或类似的四舍五入月长度。如果用例不需要绝对精确,这可以被认为是公平的解决方案,因为这在社交媒体场景中通常是正确的。据我所知,Joda-Time 不支持这种开箱即用的舍入功能(与其他库相比)。
我在 Android Studio 项目中使用 joda-time-2.5。
我无法计算出我遗漏的内容,无法正确格式化具有 and/or 年 and/or 个月的字符串。
Period 计算正确 - 但不会超出 "Weeks" 例如。 1000000 分钟的格式正确为“99wks, 1day, 10hrs + 40mins”。但不是 months/years 格式,例如。 “1 年、10 个月、3 周、1 天、10 小时 + 40 分钟”等等
我试过各种变体
Period pA = new Period(mA);
Period pA = new Period(mA, PeriodType.standard());
Period pA = new Period(mA, PeriodType.yearMonthDay());
等,但这些没有区别。
我已经尝试了 adding/removing 各种 .appends/years/months/printZero
- 这没什么区别。
我试过更改期间单位:如果我使用月或年,它会起作用,例如
Months mA = Months.months(15);
Period pA = new Period(mA, PeriodType.standard());
正确生成“1 年,3 个月”。
我知道 'years' 和 'months' 不精确(在这种情况下近似值实际上没问题),但我认为这就是 PeriodTypes/yearMonthDay 或标准所处理的?
我也试过PeriodFormat.getDefault().print(period)
没成功。
请在下面找到代码:
private String formatTimeStr(int minutes){
Minutes mA = Minutes.minutes(minutes);
Period pA = new Period(mA);
PeriodFormatter dhm = new PeriodFormatterBuilder()
.printZeroNever()
.appendYears()
.appendSuffix("year","years")
.appendSeparator(", ")
.appendMonths()
.appendSuffix("mnth", "mnths")
.appendSeparator(", ")
.appendWeeks()
.appendSuffix("wk", "wks")
.appendSeparator(", ")
.appendDays()
.appendSuffix("day", "days")
.appendSeparator(", ")
.appendHours()
.appendSuffix("hr", "hrs")
.appendSeparator(" & ")
.appendMinutes()
.appendSuffix("min", "mins")
.toFormatter();
String formattedTimeStr = dhm.print(pA.normalizedStandard());
return formattedTimeStr;
}
事实上,正如您已经认识到的那样,分钟在严格意义上不能转换为月。 Joda-Time-documentation也说出来了
If the period contains years or months, then the months will be normalized to be between 0 and 11. The days field and below will be normalized as necessary, however this will not overflow into the months field. Thus a period of 1 year 15 months will normalize to 2 years 3 months. But a period of 1 month 40 days will remain as 1 month 40 days.
从技术上讲,有两种转换选项。
a) 您定义了一个参考时间戳。然后您可以执行以下操作:
LocalDateTime tsp1 = new LocalDateTime(); // now as example
LocalDateTime tsp2 = tsp1.plusMinutes(minutes);
Period p = new Period(tsp1, tsp2, PeriodType.standard()); // or other period type?
b) 您根据时间单位的估计长度 找到并开发了一种舍入算法。例如,您可能愿意接受 30.5 天或类似的四舍五入月长度。如果用例不需要绝对精确,这可以被认为是公平的解决方案,因为这在社交媒体场景中通常是正确的。据我所知,Joda-Time 不支持这种开箱即用的舍入功能(与其他库相比)。