在Java中获取一段时间后的日期



基本上,我有一个以文本形式存储的日期,格式如下:SQLite Browser中的16/09/2014。我想知道是否有任何方法可以使用Java在数据库中的每个记录的一天、一周、一个月和一年之后获得日期。

我检索到并在列表视图中显示从数据库检索到的日期:

viewHolder.txt_ddate.setText("Next Payment On: "
                + _recurlist.get(position).getRecurringStartDate().trim());

所以我想使用Java技术来获取上面提到的日期。我对此进行了研究并找到了文档,但我不确定如何将其应用到我的问题中。

有导游吗?提前谢谢。

使用一个Calendar对象,就像您的示例一样,它提供了add方法。

String dateAsString = "16/09/2014";
DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
Calendar c = Calendar.getInstance();
c.setTime(formatter.parse(dateAsString));
c.add(Calendar.DAY_OF_MONTH, 1);
System.out.println("After one day: " + formatter.format(c.getTimeInMillis()));
c.add(Calendar.DAY_OF_MONTH, -1);
c.add(Calendar.WEEK_OF_YEAR, 1);
System.out.println("After one week: " + formatter.format(c.getTimeInMillis()));
c.add(Calendar.WEEK_OF_YEAR, -1);
c.add(Calendar.MONTH, 1);
System.out.println("After one month: " + formatter.format(c.getTimeInMillis()));
c.add(Calendar.MONTH, -1);
c.add(Calendar.YEAR, 1);
System.out.println("After one year: " + formatter.format(c.getTimeInMillis()));
c.add(Calendar.YEAR, -1);

输出:

After one day: 17/09/2014
After one week: 23/09/2014
After one month: 16/10/2014
After one year: 16/09/2015

使用Joda时间:

DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/yyyy");
LocalDate date = LocalDate.parse("16/09/2014", formatter);
System.out.println(date.toString(formatter));
System.out.println(date.plusDays(1).toString(formatter));
System.out.println(date.plusWeeks(1).toString(formatter));
System.out.println(date.plusMonths(1).toString(formatter));
System.out.println(date.plusYears(1).toString(formatter));

输出:

2014年9月16日2014年9月17日2014年9月23日2014年10月16日2015年9月16日

使用Java/Android的日历api如下:

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Date date;
try {
    date = sdf.parse(dateStr);
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    cal.add(Calendar.DAY_OF_MONTH, 1); //add one day to your date
    cal.add(Calendar.MONTH, 1); //add 1 month to your date 
    cal.add(Calendar.YEAR, 1); //add 1 year to current date
    System.out.println(sdf.format(cal.getTimeInMillis()));
} catch (ParseException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

以下是示例:

String strDate = "16/09/2014";
int noOfDays = 1;
SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
Date date = formatter.parse(strDate);
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.DATE, noOfDays);

tl;dr

LocalDate.parse( 
    "16/09/2014" , 
    DateTimeFormatter.ofPattern( "dd/MM/uuuu" )
)
.plusDays( 1 )
.format( DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) )

详细信息

提示:使用日期-时间数据类型作为日期-时间值。您应该使用面向日期的类型来定义数据库中的列,以存储日期值,而不是文本。

提示#2:当您将日期值序列化为文本时,请使用标准的ISO8601格式。这些都是合理的,实用的,按字母顺序排列。

使用java.time类,而不是现在遗留下来的麻烦的旧日期时间类。对于Android,请参阅下面的项目符号。

DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) ;
LocalDate ld = LocalDate.parse( "16/09/2014" , f ) ;
LocalDate dayAfter = ld.plusDays( 1 ) ; 
LocalDate weekAfter = ld.plusWeeks( 1 ) ;
LocalDate monthAfter = ld.plusMonths( 1 ) ;
LocalDate yearAfter = ld.plusYears( 1 ) ;

要生成标准格式的字符串,只需调用toString

String output = dayAfter.toString() ;  // YYYY-MM-DD standard format.

2014-09-17

对于其他格式,请使用如上所述的DateTimeFormatter

String output = dayAfter.format( f ) ;  

2014年9月17日


关于java.time

java.time框架是在java 8及更高版本中构建的。这些类取代了诸如java.util.DateCalendar和&SimpleDateFormat

JodaTime项目现在处于维护模式,建议迁移到java.Time类。

要了解更多信息,请参阅Oracle教程。并在Stack Overflow中搜索许多示例和解释。规范是JSR310。

从哪里获得java.time类?

  • Java SE 8Java SE 9及更高版本
    • 内置
    • 标准Java API的一部分,带有捆绑实现
    • Java 9添加了一些小功能和修复程序
  • Java SE 6Java SE 7
    • 大部分java.time功能都是向后移植到Java6&7英寸ThreeTen背包
  • 安卓
    • ThreeTenABP项目专门为安卓系统改编了ThreeTen Backport(如上所述)
    • 请参阅如何使用ThreeTenABP…

相关内容

最新更新