【问题标题】:Joda time - Not able to calculate months / years from Period in minutesJoda time - 无法从 Period 以分钟计算月/年
【发布时间】:2015-01-26 11:00:47
【问题描述】:

我在 Android Studio 项目中使用 joda-time-2.5。

我无法弄清楚我错过了什么才能正确格式化带有年份和/或月份的字符串。

期间计算正确 - 但不会超过“周”,例如。 1000000 分钟的格式正确为“99 周,1 天,10 小时 + 40 分钟”。但不是月/年格式,例如。 “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());

等等,但这些没有任何区别。

我尝试添加/删除各种.appends/years/months/printZero - 这没有任何区别。

我已尝试更改周期单位:如果我使用月或年,它将起作用,例如

    Months mA = Months.months(15);

    Period pA = new Period(mA, PeriodType.standard());

正确生成“1year, 3months”。

我知道“年”和“月”并不精确(在这种情况下,近似值实际上可以),但我认为这就是 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;
}

【问题讨论】:

  • 您需要一个参考时间戳来添加分钟输入。然后你得到两个时间戳作为计算Period的基础,然后你应该能够将分钟转换为混合月份、日期等。

标签: java jodatime periodformatter


【解决方案1】:

事实上,您已经认识到严格意义上的分钟不能转换为月Joda-Time-documentation 也会说出来。

如果期间包含年或月,则月将为 归一化为 0 到 11 之间。days 字段及以下字段将是 必要时进行归一化,但这不会溢出到 月字段。因此,1 年 15 个月的期间将正常化为 2 年 3 个月。 但 1 个月 40 天的期间将保持为 1 个月 40 天。

从技术上讲,有两种转换选项。

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 不支持开箱即用的舍入功能(与其他库相比)。

【讨论】:

  • 叹息。实际上,我确实变得绝望到真正阅读了文档:) 但不知何故,就从那段话过去了。谢谢你。我选择了您的第一个解决方案,它就像“复制和粘贴”一样简单。干杯。
猜你喜欢
  • 2017-03-06
  • 2011-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-20
  • 2011-06-10
  • 2017-01-30
  • 1970-01-01
相关资源
最近更新 更多