基本上,我有一个以文本形式存储的日期,格式如下: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.Date
、Calendar
和&SimpleDateFormat
。
JodaTime项目现在处于维护模式,建议迁移到java.Time类。
要了解更多信息,请参阅Oracle教程。并在Stack Overflow中搜索许多示例和解释。规范是JSR310。
从哪里获得java.time类?
- Java SE 8、Java SE 9及更高版本
- 内置
- 标准Java API的一部分,带有捆绑实现
- Java 9添加了一些小功能和修复程序
- Java SE 6和Java SE 7
- 大部分java.time功能都是向后移植到Java6&7英寸ThreeTen背包
- 安卓
- ThreeTenABP项目专门为安卓系统改编了ThreeTen Backport(如上所述)
- 请参阅如何使用ThreeTenABP…