Android SQLite中比较特定格式日期及转换格式的方法咨询
解决SQLite中自定义日期格式的比对与转换问题
嗨,针对你在Android SQLite应用里遇到的日期比对和格式转换问题,我来给你详细拆解两种可行的方案——在SQL查询中直接处理和在Android代码中解析处理,你可以根据场景选择合适的方式:
一、实现日期比对(判断"Mar 9 2018 6:00AM" >= 今日日期)
首先要明确:SQLite本身没有smalldatetime类型,你存储的其实是字符串,直接用字符串比对会出错(比如"Dec 31 2019"的字符串排序会比"Jan 1 2020"大,但实际日期更早),所以必须先把字符串转成标准日期格式再比对。
方案1:在SQL查询中处理
通过SQLite的字符串函数拆分日期各部分,转换为标准的yyyy-MM-dd HH:mm格式,再用datetime()函数解析后和今日日期(date('now'))比对:
SELECT * FROM your_table WHERE datetime( printf('%s-%s-%s %s', -- 提取年份 substr(date_col, instr(date_col, ' ', instr(date_col, ' ')+1)+1,4), -- 把月份缩写转成两位数字 CASE substr(date_col,1,3) WHEN 'Jan' THEN '01' WHEN 'Feb' THEN '02' WHEN 'Mar' THEN '03' WHEN 'Apr' THEN '04' WHEN 'May' THEN '05' WHEN 'Jun' THEN '06' WHEN 'Jul' THEN '07' WHEN 'Aug' THEN '08' WHEN 'Sep' THEN '09' WHEN 'Oct' THEN '10' WHEN 'Nov' THEN '11' WHEN 'Dec' THEN '12' END, -- 提取日期并补零为两位 printf('%02d', trim(substr(date_col, instr(date_col, ' ')+1, instr(date_col, ' ', instr(date_col, ' ')+1) - instr(date_col, ' ') -1))), -- 把12小时制时间转成24小时制 CASE WHEN substr(date_col, length(date_col)-1) = 'PM' THEN CASE WHEN substr(date_col, instr(date_col, ' ', instr(date_col, ' ', instr(date_col, ' ')+1)+1)+1, instr(date_col, ':') - instr(date_col, ' ', instr(date_col, ' ', instr(date_col, ' ')+1)+1) -1) = '12' THEN '12' ELSE printf('%02d', cast(substr(date_col, instr(date_col, ' ', instr(date_col, ' ', instr(date_col, ' ')+1)+1)+1, instr(date_col, ':') - instr(date_col, ' ', instr(date_col, ' ', instr(date_col, ' ')+1)+1) -1) as integer) +12) END ELSE CASE WHEN substr(date_col, instr(date_col, ' ', instr(date_col, ' ', instr(date_col, ' ')+1)+1)+1, instr(date_col, ':') - instr(date_col, ' ', instr(date_col, ' ', instr(date_col, ' ')+1)+1) -1) = '12' THEN '00' ELSE printf('%02d', cast(substr(date_col, instr(date_col, ' ', instr(date_col, ' ', instr(date_col, ' ')+1)+1)+1, instr(date_col, ':') - instr(date_col, ' ', instr(date_col, ' ', instr(date_col, ' ')+1)+1) -1) as integer)) END END || ':' || substr(date_col, instr(date_col, ':')+1,2) ) ) >= date('now');
方案2:在Android代码中解析处理
用Java的日期类解析字符串,再和今日日期(取当天凌晨0点)比对,代码更易读:
方式1:使用SimpleDateFormat(兼容旧版Android)
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Locale; // 从数据库获取的日期字符串 String dateStrFromDb = "Mar 9 2018 6:00AM"; // 定义输入格式(注意指定Locale.US,避免中文环境下解析英文月份出错) SimpleDateFormat inputSdf = new SimpleDateFormat("MMM dd yyyy hh:mmaa", Locale.US); // 定义今日凌晨0点的时间(用于比对) Calendar todayCal = Calendar.getInstance(); todayCal.set(Calendar.HOUR_OF_DAY, 0); todayCal.set(Calendar.MINUTE, 0); todayCal.set(Calendar.SECOND, 0); todayCal.set(Calendar.MILLISECOND, 0); Date todayStart = todayCal.getTime(); try { Date dbDate = inputSdf.parse(dateStrFromDb); // 比对:dbDate >= 今日凌晨0点 if (dbDate.compareTo(todayStart) >= 0) { // 符合条件的逻辑 } } catch (ParseException e) { e.printStackTrace(); // 处理日期解析失败的情况 }
方式2:使用Java 8+的LocalDateTime(推荐,更简洁)
import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Locale; String dateStrFromDb = "Mar 9 2018 6:00AM"; DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("MMM dd yyyy hh:mm a", Locale.US); LocalDateTime dbDateTime = LocalDateTime.parse(dateStrFromDb, inputFormatter); // 获取今日的起始时间(凌晨0点) LocalDate today = LocalDate.now(); LocalDateTime todayStart = today.atStartOfDay(); // 比对逻辑 if (dbDateTime.isAfter(todayStart) || dbDateTime.isEqual(todayStart)) { // 符合条件的逻辑 }
二、将日期格式转换为"yyyy-MM-dd"
同样有两种方式:
方案1:在SQL查询中转换
直接提取并拼接年份、月份、日期:
SELECT printf('%s-%s-%s', substr(date_col, instr(date_col, ' ', instr(date_col, ' ')+1)+1,4), CASE substr(date_col,1,3) WHEN 'Jan' THEN '01' WHEN 'Feb' THEN '02' WHEN 'Mar' THEN '03' WHEN 'Apr' THEN '04' WHEN 'May' THEN '05' WHEN 'Jun' THEN '06' WHEN 'Jul' THEN '07' WHEN 'Aug' THEN '08' WHEN 'Sep' THEN '09' WHEN 'Oct' THEN '10' WHEN 'Nov' THEN '11' WHEN 'Dec' THEN '12' END, printf('%02d', trim(substr(date_col, instr(date_col, ' ')+1, instr(date_col, ' ', instr(date_col, ' ')+1) - instr(date_col, ' ') -1))) ) AS formatted_date FROM your_table;
方案2:在Android代码中转换
方式1:SimpleDateFormat
SimpleDateFormat inputSdf = new SimpleDateFormat("MMM dd yyyy hh:mmaa", Locale.US); SimpleDateFormat outputSdf = new SimpleDateFormat("yyyy-MM-dd", Locale.US); try { Date date = inputSdf.parse(dateStrFromDb); String formattedDate = outputSdf.format(date); // 使用formattedDate } catch (ParseException e) { e.printStackTrace(); }
方式2:Java 8+ LocalDate
DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("MMM dd yyyy hh:mm a", Locale.US); DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); LocalDate localDate = LocalDate.parse(dateStrFromDb, inputFormatter); String formattedDate = localDate.format(outputFormatter);
内容的提问来源于stack exchange,提问作者Jacky Teaw
相关产品推荐
相关产品推荐

