Android 7天前(一周)获取date

如何在Android中以这种格式从现在开始在一周之前获取date

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 

例如:现在2010-09-19 HH:mm:ss ,一周之前2010-09-12 HH:mm:ss

谢谢

parsingdate:

 Date myDate = dateFormat.parse(dateString); 

然后或者找出你需要减去多less毫秒:

 Date newDate = new Date(myDate.getTime() - 604800000L); // 7 * 24 * 60 * 60 * 1000 

或者使用java.util.Calendar类提供的API:

 Calendar calendar = Calendar.getInstance(); calendar.setTime(myDate); calendar.add(Calendar.DAY_OF_YEAR, -7); Date newDate = calendar.getTime(); 

然后,如果你需要,将其转换回一个string:

 String date = dateFormat.format(newDate); 

我已经创build了自己的函数,可能有助于获取下一个/前一个date

当前date:

 /** * Pass your date format and no of days for minus from current * If you want to get previous date then pass days with minus sign * else you can pass as it is for next date * @param dateFormat * @param days * @return Calculated Date */ public static String getCalculatedDate(String dateFormat, int days) { Calendar cal = Calendar.getInstance(); SimpleDateFormat s = new SimpleDateFormat(dateFormat); cal.add(Calendar.DAY_OF_YEAR, days); return s.format(new Date(cal.getTimeInMillis())); } 

例:

 getCalculatedDate("dd-MM-yyyy", -10); // It will gives you date before 10 days from current date getCalculatedDate("dd-MM-yyyy", 10); // It will gives you date after 10 days from current date 

如果你想通过自己的date得到计算date

 public static String getCalculatedDate(String date, String dateFormat, int days) { Calendar cal = Calendar.getInstance(); SimpleDateFormat s = new SimpleDateFormat(dateFormat); cal.add(Calendar.DAY_OF_YEAR, days); try { return s.format(new Date(s.parse(date).getTime())); } catch (ParseException e) { // TODO Auto-generated catch block Log.e("TAG", "Error in Parsing Date : " + e.getMessage()); } return null; } 

通过自己的date示例:

 getCalculatedDate("01-01-2015", "dd-MM-yyyy", -10); // It will gives you date before 10 days from given date getCalculatedDate("01-01-2015", "dd-MM-yyyy", 10); // It will gives you date after 10 days from given date 

TL;博士

 LocalDate .now( ZoneId.of( "Pacific/Auckland" ) ) // Get the date-only value for the current moment in a specified time zone. .minusWeeks( 1 ) // Go back in time one week. .atStartOfDay( ZoneId.of( "Pacific/Auckland" ) ) // Determine the first moment of the day for that date in the specified time zone. .format( DateTimeFormatter.ISO_LOCAL_DATE_TIME ) // Generate a string in standard ISO 8601 format. .replace( "T" , " " ) // Replace the standard "T" separating date portion from time-of-day portion with a SPACE character. 

java.time

现代的方法使用java.time类。

LocalDate类代表没有时间和没有时区的只有date的值。

时区对确定date至关重要。 对于任何特定的时刻,date在全球各地按照地区而不同。 例如, 巴黎午夜过后几分钟, 法国是一个新的一天,而在魁北克蒙特利尔仍然是“昨天”。

America/MontrealAfrica/CasablancaPacific/Aucklandcontinent/region的格式指定适当的时区名称 。 切勿使用3-4字母缩写(如ESTIST因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

 ZoneId z = ZoneId.forID( "America/Montreal" ) ; LocalDate now = LocalDate.now ( z ) ; 

minus…plus…方法做一些math运算。

 LocalDate weekAgo = now.minusWeeks( 1 ); 

让java.time确定所需时区的一天中的第一个时刻。 不要以为一天从00:00:00开始。 “夏令时”等exception意味着该日可能会在其他时间点开始,如01:00:00

 ZonedDateTime weekAgoStart = weekAgo.atStartOfDay( z ) ; 

使用DateTimeFormatter对象生成一个表示此ZonedDateTime对象的string。 search堆栈溢出了关于这个类的更多讨论。

 DateTimeFormatter f = DateTimeFormatter.ISO_LOCAL_DATE_TIME ; String output = weekAgoStart.format( f ) ; 

这个标准格式接近你想要的,但在你想要一个SPACE的中间有一个T 所以用TreplaceSPACE。

 output = output.replace( "T" , " " ) ; 

关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧的遗留date时间类,如java.util.DateCalendarSimpleDateFormat

Joda-Time项目现在处于维护模式 ,build议迁移到java.time类。

要了解更多信息,请参阅Oracle教程 。 并search堆栈溢出了很多例子和解释。 规范是JSR 310 。

从何处获取java.time类?

  • Java SE 8Java SE 9和更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6Java SE 7
    • 大部分的java.timefunction都被移植到了ThreeTen-Backport中的 Java 6&7中。
  • Android的
    • ThreeTenABP项目专门针对Android,采用了ThreeTen-Backport (上文提到)。
    • 请参阅如何使用ThreeTenABP …。

乔达时间

更新: Joda-Time项目现在处于维护模式。 团队build议迁移到java.time类。

使用Joda-Time库使date时间工作更容易。

请注意使用时区。 如果省略,则使用UTC或JVM的当前默认时区。

 DateTime now = DateTime.now ( DateTimeZone.forID( "America/Montreal" ) ) ; DateTime weekAgo = now.minusWeeks( 1 ); DateTime weekAgoStart = weekAgo.withTimeAtStartOfDay(); 

我可以看到两种方法:

  1. 使用GregorianCalendar :

     Calendar someDate = GregorianCalendar.getInstance(); someDate.add(Calendar.DAY_OF_YEAR, -7); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String formattedDate = dateFormat.format(someDate); 
  2. 使用android.text.format.Time :

     long yourDateMillis = System.currentTimeMillis() - (7 * 24 * 60 * 60 * 1000); Time yourDate = new Time(); yourDate.set(yourDateMillis); String formattedDate = yourDate.format("%Y-%m-%d %H:%M:%S"); 

解决scheme1是“官方”的java方式,但使用GregorianCalendar可能会有严重的性能问题,所以Android工程师添加了android.text.format.Time对象来解决这个问题。