【问题标题】:Android error when convert month name转换月份名称时出现Android错误
【发布时间】:2014-06-18 20:16:04
【问题描述】:

通过这个查询,我选择了数据库中的月份。光标返回确切的月份,但是当我进行转换以显示全名时,下个月出现。例如,光标返回 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();

【问题讨论】:

    标签: java android sqlite date calendar


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 好的,但是现在我在微调器中看到月份名称,我必须转换为整数才能进行另一个查询。我这样做:` String mese = monthSelector.getSelectedItem().toString();日历 cal = Calendar.getInstance();尝试 { cal.setTime(new SimpleDateFormat("MMMM").parse(mese)); } catch (ParseException e) { e.printStackTrace(); } int monthInt = cal.get(Calendar.MONTH + 1); String monthConverted = ""+monthInt; if(monthInt
    • @user2847219:因为你想要的是cal.get(Calendar.MONTH) + 1,而不是cal.get(Calendar.MONTH + 1)——你现在得到了一个完全不同的领域!
    【解决方案2】:

    java.time

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

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

    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.time 功能向后移植到 Java 6 和 7 . 如果您正在为一个 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

    【讨论】:

    • Table.DATA not 属于 DATE 类型,因为 SQLite 中没有 DATE 数据类型:sqlite.org/datatype3.html 另外,这是关于使用代码的 Android 和 SQLiteDatabase 类的问题不知道数据库在设备中的位置并管理对它的访问。您的代码使用 Java 访问数据库,而不提供连接到数据库的方法。什么是conn?如何建立与数据库的连接?
    • 感谢@forpas 指出。非常感激!我不知道 SQLiteDatabase。我现在已经更新了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    相关资源
    最近更新 更多