有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

转换月份名称时发生java Android错误

通过这个查询,我在数据库中选择月份。光标返回的是确切的月份,但当我进行转换以显示全名时,将在下个月显示。例如,游标返回6,而方法返回getDisplayName July

SQLiteDatabase db = new DatabaseHelper(getActivity()).getReadableDatabase();

    String sql = "SELECT DISTINCT strftime('%m',"+Table.DATA+") FROM "+Table.TABLE_NAME;
    Cursor c = db.rawQuery(sql, null);

    while (c.moveToNext()){
        int monthNumero = (c.getInt(0));

        Calendar ca = Calendar.getInstance();
        ca.set(Calendar.MONTH, monthNumero);
        String monthName = ca.getDisplayName
                (Calendar.MONTH, Calendar.LONG, Locale.getDefault()).toUpperCase();

        result1.add(monthName);

    }
    db.close();

共 (2) 个答案

  1. # 1 楼答案

    For example, the cursor returns 6, instead the method returns getDisplayName July.

    是的,会的。因为Calendar.MONTH“逻辑字段”是基于0的。(疯狂的决定,但是……)

    基本上你需要从月数中减去1:

    ca.set(Calendar.MONTH, monthNumero - 1);
    

    例如Calendar.JANUARY被记录为具有0的值

  2. # 2 楼答案

    爪哇。时间

    java.util日期时间API及其格式化API SimpleDateFormat已经过时且容易出错。建议完全停止使用它们,并切换到java.time,即modern Date-Time API*

    使用java.time现代日期时间API的解决方案:

    import java.time.Month;
    
    public class Main {
        public static void main(String[] args) {
            int monthNumero = 6;
            String monthName = Month.of(monthNumero).toString();
            System.out.println(monthName);
        }
    }
    

    输出:

    JUNE
    

    ONLINE DEMO

    Trail: Date Time了解有关现代日期时间API的更多信息


    *无论出于何种原因,如果您必须坚持使用Java 6或Java 7,您可以使用ThreeTen-Backport来支持大部分Java。Java 6&;的时间功能;7.如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请检查Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project