使用此查询,我在数据库中选择月份。光标返回确切的月份,但是当我进行转换以显示全名时,将在下个月出现。例如,游标返回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();
答案 0 :(得分:3)
例如,光标返回6,而方法返回getDisplayName July。
是的,它会的。因为Calendar.MONTH
"逻辑字段"是基于0的。 (疯狂的决定,但......)
基本上你需要从月份数中减去1:
ca.set(Calendar.MONTH, monthNumero - 1);
例如,Calendar.JANUARY
被记录为值为0.
答案 1 :(得分:1)
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
从 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 desugaring 和 How to use ThreeTenABP in Android Project。