Java android获取相应日期的上一个日期(不是昨天的日期)

Java android获取相应日期的上一个日期(不是昨天的日期),java,android,date,calendar,simpledateformat,Java,Android,Date,Calendar,Simpledateformat,在标记副本之前,请仔细阅读问题。 我想要对应日期的前一个日期。(不是昨天的日期) e、 g.如果用户单击按钮一次,他将被导航到另一个屏幕,并显示有关昨天的数据 如果他再次点击屏幕上的同一个按钮,那么数据应该在前天显示出来……等等。。。直到数据出现在我的数据库中 myPreparedStatement.setObject( … , localDate ) ; 所以我想得到对应日期的前一个日期。i、 e.如果我有日期2014年1月31日(我使用31012014格式存储在db中),那么我应该得到日期

在标记副本之前,请仔细阅读问题。

我想要对应日期的前一个日期。(不是昨天的日期)

e、 g.如果用户单击按钮一次,他将被导航到另一个屏幕,并显示有关昨天的数据

如果他再次点击屏幕上的同一个按钮,那么数据应该在前天显示出来……等等。。。直到数据出现在我的数据库中

myPreparedStatement.setObject( … , localDate ) ;
所以我想得到对应日期的前一个日期。i、 e.如果我有日期2014年1月31日(我使用31012014格式存储在db中),那么我应该得到日期30012014

我知道如何获取昨天的日期,例如下面的代码

    Calendar calendar = Calendar.getInstance();
    calendar.add(Calendar.DATE, -1);
    DateFormat dateFormat = new SimpleDateFormat("ddMMyyyy", Locale.getDefault());
    String yesterdayAsString = dateFormat.format(calendar.getTime());
它给出了与今天相比的日期,但我希望将前一个日期与其他有效日期进行比较


因此,如何获得它。

例如,您必须使用SimpleDataFormat转换字符串>日期,在日期>日历之后

String sDate = "31012014";
SimpleDateFormat dateFormat = new SimpleDateFormat("ddMMyyyy", Locale.getDefault());
Date date = dateFormat.parse(sDate);
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.DATE, -1);
String yesterdayAsString = dateFormat.format(calendar.getTime());

您已经做好了一切准备,除了在“添加”-1天之前,您需要将其设置为您想要的日期(在查找上一个日期之前):


首先,作为提示,最好将日期存储为时间戳,这样就不会依赖于时间格式

至于您的问题,只需将当前日期保存在一个变量中,并在单击按钮后将其发送给您的方法,然后再减去一天

Calendar curDate = Calendar.getInstance();
curDate.add(Calendar.DATE, -1);

然后使用curDate变量

使用它的工作代码和测试代码

private String getPreviousDate(String inputDate){
                inputDate = "15-12-2015"; // for example 
                SimpleDateFormat  format = new SimpleDateFormat("dd-MM-yyyy");  
                try {  
                    Date date = format.parse(inputDate); 
                    Calendar c = Calendar.getInstance();
                    c.setTime(date);

                    c.add(Calendar.DATE, -1);
                    inputDate = format.format(c.getTime());
                    Log.d("asd", "selected date : "+inputDate);

                    System.out.println(date);  
                } catch (Exception e) {  
                    // TODO Auto-generated catch block  
                    e.printStackTrace();  
                      inputDate ="";
                }
                return inputDate;
            }
试试这个:

final Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.DATE, -1);
        String yesterdayAsString = fmtOut.format(calendar.getTime());
试试这个

    String prevDate;
    Date c = Calendar.getInstance().getTime();
    SimpleDateFormat df = new SimpleDateFormat("dd-MMM-yyyy");
    String todayDate=df.format(c);

    Date date = null;
    try {
        date = df.parse(todayDate);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    calendar.add(Calendar.DATE, -1);
    prevDate = df.format(calendar.getTime());

    Test=(TextView)findViewById(R.id.test);
    Test.setText(prevDate);
tl;博士 使用现代java.time类。反复减去一天,使时间向后移动

LocalDate                          // Represent a date-only value, without time-of-day and without time zone.
.now(                              // Determine the current date as perceived in the wall-clock time used by the people of a particular region (a time zone). 
    ZoneId.of( "Europe/Paris" )    // Use real time zone names in `Continent/Region` format, never 2-4 letter pseudo-zones such as PST, EST, IST, CEST, etc.
)                                  // Returns a `LocalDate` object.
.minusDays( 1 )                    // Move back in time by one day, for yesterday’s date. Returns another separate `LocalDate` object rather than modify the original, per Immutable Objects pattern.
.minusDays( 1 )                    // Continue moving back in time another day.
.minus(
    Period.ofDays( 1 )             // Define a span-of-time as any number of years-months-weeks-days. 
)                                  // Continuing to subtract yet another day.
.toString()                        // Generate text representing that last generated `LocalDate` date-value using standard ISO 8601 format.
解析文本输入时

LocalDate
.parse( 
    "30012014" ,
    DateTimeFormatter.ofPattern( "ddMMuuuu" ) 
)
.minusDay( 1 )
.minus(
    Period.ofDays( 1 )        
)    
java.time 现代方法使用多年前的java.time类取代了麻烦的旧日期时间类

LocalDate
该类表示一个只包含日期的值,不包含一天中的时间,也不包含或

时区对于确定日期至关重要。在任何一个特定的时刻,世界各地的日期都因地区而异。例如,中午夜后几分钟是新的一天,而中仍然是“昨天”

如果未指定时区,JVM将隐式应用其当前默认时区。该默认值可能在运行时(!)期间出现,因此您的结果可能会有所不同。最好将您的参数显式指定为参数

大陆/地区
的格式指定,例如,或
太平洋/奥克兰
。切勿使用2-4个字母的缩写,如
EST
IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)

如果要使用JVM的当前默认时区,请请求它并将其作为参数传递。如果省略,则隐式应用JVM的当前默认值。最好是显式的,因为JVM中任何应用程序的任何线程中的任何代码都可能在运行时的任何时刻更改默认值

ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.
或者指定一个日期。你可以用一个数字来设置月份,1-12月的数字为1-12

LocalDate ld = LocalDate.of( 1986 , 2 , 23 ) ;  // Years use sane direct numbering (1986 means year 1986). Months use sane numbering, 1-12 for January-December.
或者,最好使用预定义的枚举对象,一年中每个月一个。提示:在整个代码库中使用这些
Month
对象,而不仅仅是一个整数,这样可以使代码更加自我记录,确保有效值,并提供更高的可用性

日期数学 你的问题不清楚,但似乎你只是想一天一天地向后增加时间。使用
LocalDate
类提供的
plus
minus
方法,这非常容易

调用便利方法

要向后移动,请再次减法

LocalDate localDatePrior = yesterday.minusDays( 1 ) ;
继续前进

localDatePrior = localDatePrior.minusDays( 1 ) ;
您可以使用带有该方法的类对要减去的时间段进行软编码

数据库 (我使用31012014格式存储在db中)

不要

要在数据库中存储仅限日期的值,请在列中使用仅限日期的类型。在符合SQL的数据库中,仅日期值的类型将为
DATE

从JDBC4.2开始,我们可以直接与数据库交换java.time对象

myPreparedStatement.setObject( … , localDate ) ;
检索

LocalDate localDate = myResultSet.getObject( … , LocalDate.class ) ;
解析 但是为了直接解决当前的情况,您可以使用DDMMYYYY的特殊格式解析字符串

DateTimeFormatter f = DateTimeFormatter.ofPattern( "ddMMuuuu" ) ;
LocalDate localDate = LocalDate.parse( "30012014" , f ) ;
String output = localDate.toString() ;  // Generate text in standard ISO 8601 format.
顺便说一句,与其发明自己的日期时间格式,不如在将日期时间值交换为文本时始终使用标准格式。默认情况下,java.time类在解析/生成字符串时会明智地使用这些格式


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*

从哪里获得java.time类

  • 、和更高版本-标准Java API的一部分,带有捆绑实现。
    • Java9添加了一些次要功能和修复
    • 大多数java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类

    • 对于早期的Android(Welcome@Shirisherwade:)供参考,像
      java.util.date
      java.util.Calendar
      、和
      java.text.SimpleDateFormat
      这样麻烦的旧日期时间类现在已经被这些类所取代。大部分java.time功能都在项目中被向后移植到Java6和Java7。进一步适应项目中早期的Android。请参见.FYI,诸如
      java.util.date
      java.util.Calendar
      、和
      java.text.SimpleDateFormat
      等麻烦的旧日期-时间类现在是遗留的,被这些类所取代。大部分java.time功能
      Period p = Period.ofDays( 1 ) ;
      LocalDate localDatePrior = yesterday.minus( p ) ;
      
      myPreparedStatement.setObject( … , localDate ) ;
      
      LocalDate localDate = myResultSet.getObject( … , LocalDate.class ) ;
      
      DateTimeFormatter f = DateTimeFormatter.ofPattern( "ddMMuuuu" ) ;
      LocalDate localDate = LocalDate.parse( "30012014" , f ) ;
      String output = localDate.toString() ;  // Generate text in standard ISO 8601 format.