转换月份名称时出现Android错误

时间:2014-06-18 20:16:05

标签: java android sqlite date calendar

使用此查询,我在数据库中选择月份。光标返回确切的月份,但是当我进行转换以显示全名时,将在下个月出现。例如,游标返回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 个答案:

答案 0 :(得分:3)

  

例如,光标返回6,而方法返回getDisplayName July。

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

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

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

例如,Calendar.JANUARY被记录为值为0.

答案 1 :(得分:1)

java.time

java.util 日期时间 API 及其格式化 API SimpleDateFormat 已过时且容易出错。建议完全停止使用它们并切换到 java.timemodern 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 了解有关现代 Date-Time API 的更多信息。


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project