Java将天数间隔转换为日期

时间:2016-05-09 20:53:08

标签: java date calendar

我的日期格式如下:   - dd。 - dd.MM.yyyy

根据我希望从日期和日期收到的这些信息。

伪代码中的天真实现是:

  • 将日期分为第一部分和第二部分
  • 为第二部分
  • 创建SimpleDateFormat
  • 看看第一部分中的数字是否高于第二部分中的数字。
  • 如果是:
    • 第一次减少月份
    • 从日期创建,其中包含第一部分的dd,第二部分的月份和第二部分的年份。
  • 如果不是:
    • 从日期创建,其中包含第一部分的dd以及第二部分的月份和年份。

这个解决方案大部分时间都可能有效,但感觉相当尴尬。没有更好的解决方案吗?

2 个答案:

答案 0 :(得分:0)

我建议你检查一下包

...
<p:dataTable var="convert"
    value="#{convertirDeviseCtr.listeDevise}" style="width:70%"
    id="convertir" selection="#{someController.selectionProperty}">
...

特别是以下课程

<p:dataTable>

答案 1 :(得分:0)

java.time

java.time框架内置于Java 8及更高版本中。大部分功能都被后端移植到Java 6&amp; 7和Android。

我在这里提供了一些示例代码,但未经测试 - 从不运行。应该让你朝着正确的方向前进。

这个问题有两个棘手的部分:

  • 年度
    问题说明要分配年份。对于1月份的停止日期而言并非如此,其开始日期为12月的上个月。在这种情况下你想要前一年。解决方法是让java.time减去一个月并为你处理Jan-to-Dec数学。
  • 月份长度
    各个月有不同的长度,不同的天数,显然。请注意,您不能尝试将日期31放到4月份。如果您的输入数据始终是干净且有效的,并且下面的算法是正确的,那么这应该是一个非问题。不过,我肯定会在下面的示例代码中添加一些异常捕获的代码来捕获任何形成无效日期的尝试。

我将跳过字符串拆分部分,并假设您有第一部分的数字(日期)和第二部分的日期字符串。

long dayOfMonth = Long.longValue( "31" );

该日期不在standard format,因此我们必须指定formatting patternLocalDate表示没有时间且没有时区的仅限日期的值。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "dd.MM.yyyy" );
LocalDate stop = LocalDate.parse( "21.05.2016" , formatter );

我们可以提取比较日期。

LocalDate start = null;
int d = localDate.getDayOfMonth();

进行比较。

if( dayOfMonth >=d ) { // If start is in previous month…
    start = stop.minusMonths( 1 ).withDayOfMonth( dayOfMonth );
} else if (dayOfMonth < d ) { // If start is in same month…
    start = stop.withDayOfMonth( dayOfMonth );
} else {
    // FIXME: handle impossible condition as error. The 'if' statements are flawed.
}

顺便说一下,这个输入数据的格式很笨拙,而且坦率地说是愚蠢的。这种宝贵的“聪明”创造了额外的工作,给了混乱和错误的机会,在没有任何好处的情况下完全没有必要,并且让我疯狂。如果您对此输入数据有任何控制权,我强烈建议您进行两项可能的更改。

  • 首先,如果在您的应用中交换数据,请不要使用字符串。使用对象。上面你已经看到了LocalDate对象。你可以传递那些。甚至可以定义自己的类LocalDateRange来容纳一对LocalDate个对象。或者,请参阅this Question,尤其是this Answer,其中涉及使用Google GuavaRange来保存LocalDate个对象。

  • 其次,当您必须将日期时间值序列化为字符串时,请使用标准ISO 8601格式。这种用法很简单,因为java.time类在解析/生成字符串时默认使用这些格式。仅限日期的值应为YYYY-MM-DD顺序。 date range interval是一对与斜杠(SOLIDUS)匹配的字符串,或者当斜杠不合适时(例如,与Unix相关的文件系统中的文件或文件夹命名)的一对连字符。