如何从ContentProvider返回的Cursor中获取DATETIME值?
处理ContentProvider Cursor中的DATETIME字段
嗨,这个问题我之前开发的时候也碰到过!Android的Cursor确实没有直接返回Date对象的API,不过有几种靠谱的处理方式,我给你详细说说:
方案一:按字符串解析(最通用)
SQLite里的DATETIME类型本质上是以字符串形式存储的(常见格式是YYYY-MM-DD HH:MM:SS),所以你可以先把它当作字符串取出,再解析成Date或JDK8+的日期对象:
适配低版本Android(API < 26)
用SimpleDateFormat来解析:
try { int dateColumnIndex = cursor.getColumnIndex("your_datetime_column_name"); String dateStr = cursor.getString(dateColumnIndex); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()); Date date = sdf.parse(dateStr); // 拿到Date对象后就可以按需使用了 } catch (ParseException e) { // 处理解析失败的情况,比如格式不匹配 e.printStackTrace(); }
适配Android 8.0+(API >= 26)
推荐用更安全的DateTimeFormatter(来自java.time包):
int dateColumnIndex = cursor.getColumnIndex("your_datetime_column_name"); String dateStr = cursor.getString(dateColumnIndex); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss", Locale.getDefault()); LocalDateTime localDateTime = LocalDateTime.parse(dateStr, formatter); // 如果需要转换成传统的Date对象 Date date = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
方案二:用时间戳存储(需控制数据插入逻辑)
如果你能自主控制ContentProvider底层表的结构和数据插入流程,建议把DATETIME字段改成INTEGER类型,存储毫秒级时间戳(比如System.currentTimeMillis()返回的值)。
这样读取的时候就可以直接取Long值转成Date:
int timestampColumnIndex = cursor.getColumnIndex("your_timestamp_column"); long timestamp = cursor.getLong(timestampColumnIndex); Date date = new Date(timestamp);
这种方式避免了字符串解析的异常风险,性能也更好,但只适用于你能修改Provider的情况。
内容的提问来源于stack exchange,提问作者ardevd
相关产品推荐
相关产品推荐

