这个目标日期计算器出了什么问题?

问题描述 投票:0回答:2

我前段时间为我的项目编写了这段代码,它应该计算用户可能实现其饮食目标的目标日期。但在测试应用程序时,我发现无论输入的目标是什么,目标日期总是比创建日期大一个月。

这是代码

    public String calcTD(SQLiteDatabase db){
    String date = null;
    myDataBase = db;
    Cursor c = myDataBase.rawQuery("SELECT * FROM USER", null);
    if (c!= null){
        if (c.moveToFirst()){
          String cdate = c.getString(c.getColumnIndex("CreatedDate"));              
          String type = c.getString(c.getColumnIndex("GoalType"));              
          if (type == "Maintain Weight")
                date = cdate;
          else{               
            int rate = c.getInt(c.getColumnIndex("Rate"));
            float gw = c.getFloat(c.getColumnIndex("GoalWeight"));
            float cw = getCW(db); //get current weight
            float w = 0; int days = 0;
            if (type == "Lose Weight")
                 w = cw - gw;
            else if (type == "Gain Weight")
                w = gw - cw;                
            switch (rate){
            case 0: // the rate 250g/week
                days = Math.round(w * 7 * 4); 
                break;
            case 1: //the rate 500g/week
                days = Math.round(w * 7 * 2); 
                break;
            case 2://the rate 750g/week
                days = Math.round(w * 7 * (4/3)) ;
                break;
            case 3:the rate 1kg/week
                days = Math.round(w * 7);
                break;
            }
            int y, m, d;
                            // the currentDate format (YYYYMMDD)
            y = Integer.parseInt(cdate.substring(0,4));
            m = Integer.parseInt(cdate.substring(4,6));
            d = Integer.parseInt(cdate.substring(6,8));             
            GregorianCalendar  i = new GregorianCalendar(y, m, d);
            i.add(Calendar.DAY_OF_MONTH, days);
            date = AllCmnMtd.getDate(i);    // this will convert the date to a string with format (yyyymmdd)            

            }               
        }
    }
    return date;    
}

抱歉,我这么烦人,但是我的项目在两周内进行了答辩,并且在测试应用程序时遇到了很多错误! :(。

谢谢您并致以诚挚的问候

android date
2个回答
3
投票

Java 的 Calendar 类使用基于 0 的月份索引。前任。 0 是一月,11 是十二月。

在放入 Calendar 对象之前,先将 m 减一。


0
投票

java.time

在现代 Java 中,使用 java.time 类进行日期时间工作。切勿使用

Date
Calendar
GregorianCalendar
SimpleDateFormat

替换此代码:

GregorianCalendar  i = new GregorianCalendar(y, m, d);
i.add(Calendar.DAY_OF_MONTH, days);
date = AllCmnMtd.getDate(i);    // this will convert the date to a string with format (yyyymmdd)     

…使用

java.time.LocalDate
来表示仅日期值。没有时间、没有时区或偏移。

与遗留的日期时间类不同,java.time使用sane编号。因此,1 月至 12 月的月份编号为 1-12。

DateTimeFormatter
带有常量
BASIC_ISO_DATE
定义您想要的日期格式:YYYYMMDD。虽然ISO 8601日期时间格式标准中定义的完整格式使用连字符 (YYYY-MM-DD),但该标准允许“基本”变体,最大限度地减少连字符等分隔符的使用。

LocalDate start = LocalDate.of( y , m , d ) ;
LocalDate later = start.plusDays( days ) ;
String output = later.format( DateTimeFormatter.BASIC_ISO_DATE ) ;  // "Basic" means a version of ISO 8601 format that minimizes the use of delimiters. 
© www.soinside.com 2019 - 2024. All rights reserved.