Joda库无法正常工作

时间:2014-09-15 10:22:17

标签: android jodatime

我在我的Android应用程序中使用Joda库来计算两个给定日期之间的持续时间。使用此应用程序计算一个人的年龄。 以下代码给出了这个输出:23年11个月和6天

DateTime from_readable_dateTime = new DateTime(from_date_dt);
DateTime to_readable_dateTime = new DateTime(to_date_dt);
Period period = new Period(from_readable_dateTime, to_readable_dateTime);
在这种情况下,

from_date_dt是1990/01/06,to_date_dt是2014/09/15。 (日期格式为yyyy / mm / dd)。正如我之前提到的,这段代码与给定输入的输出必须是24年,7个月和20天,而我得到23年11个月和6天。问题是什么?我做错了什么或者Joda有问题吗?

UPDATE-1

我从3个数字选择器获得3个数字作为年,月和日我将单个字符串作为日期(开始日期变量命名为from_date_string,结束日期命名为to_date_string),我将这两个字符串转换为日期变量(from_date_dt和to_date_dt):

from_date_dt = null;
to_date_dt = null;
diff_dt = null;
dateFormat = new SimpleDateFormat("yyyy/mm/dd"); 
try {
       from_date_dt = dateFormat.parse(from_date_string);
       to_date_dt = dateFormat.parse(to_date_string);
    } catch (ParseException e) {
       e.printStackTrace();
    }

顺便说一句,我正在使用波斯日历。由于我无法使用默认日期选择器,因此我使用数字选择器作为日期选择器。

1 个答案:

答案 0 :(得分:2)

您隐式使用的标准期间类型包含周数。类Period有另一个带有3个参数的构造函数,您可以将PeriodType.yearMonthDay()指定为第三个参数。

LocalDate d1 = new LocalDate(1990, 1, 6);
LocalDate d2 = new LocalDate(2014, 9, 15);
Period p = new Period(d1, d2, PeriodType.yearMonthDay());
System.out.println(p); // output: P24Y8M9D

以细粒度步骤解释结果:

[1990-01-06] + 24 years = [2014-01-06]
[2014-01-06] + 8 months = [2014-09-06]
[2014-09-06] + 9 days = [2014-09-15]

要考虑的另一件事是,如果您的输入只是简单的日期格式,请不要使用DateTime。你真的想考虑时区效应吗?为什么你使用SimpleDateFormat虽然JodaTime有自己的格式化程序?

更新OP问题后更新:

现在问题变得更加清晰了。

首先一般要注意,如果您使用数字选择器,那么年,月和日的原始输入只是整数。在这种情况下,我通常根本不会使用格式化程序,而只是将数字传递给LocalDate的构造函数。此构造函数还将自动验证输入。您尝试的复杂转换非常容易出错(数字到字符串,然后字符串连接到日期字符串,然后使用您的默认时区解析它,然后将java.util.Date传递给DateTime-ctor)。它可以完全避免。

第二要注意并且最重要:您写道,您使用的是波斯日历。那么你不能使用默认日期选择器的原因很简单,这个默认日期选择器不支持波斯日历的日历规则。我的推测是对的吗?这里给你带来了非常坏的消息: Jodas课程也不支持波斯语日历,尤其是LocalDateDateTime仅针对ISO-8601标准而设计,该标准基于现代的普通格里高利历。例如月份长度在格里高利历和波斯日历中是不同的,因此需要完全不同的日历算术,而Joda-Time不支持。

因此,您试图让用户定义波斯语年,月和日这一事实可以解释您的奇怪期间结果。然后你尝试从宽松地解析这个输入(否则Joda-Time会立即抱怨奇数日值)。但是最后一步 - 周期计算 - 必须失败,因为它基于Joda-Time中的ISO-8601而不是波斯日历规则。

我是对的吗?或者我误解了你的更新问题?

难以解决问题。如果你真的想要为波斯日历计算周期,那么你必须从头开始构建它。据我所知,实际上没有支持此功能的库。编写波斯语解决方案的指南可以是此SO-post中讨论的算法。

UPDATE表示解决方案:

与此同时,我在Time4A中实施了波斯日历,另见SO-post。因此,如果您能够使用Time4A并将PersianCalendar与上面提到的多单位时间段的算法结合起来,那么这将解决您的问题。 Time4A-v3.15-2016a明确支持使用与格里历日历单位不同的特殊波斯日历单位。