Android字符串转日期异常:为何转换结果不符预期
问题原因及解决办法
为什么你的代码会输出奇怪的日期?
- Date对象本身没有格式:
Date本质只是记录时间戳的对象,不存在固定格式。你用""+date打印时,调用的是Date.toString()方法,输出的是JVM默认的带时区日期格式,和你解析时指定的格式完全无关。 - 时区与解析的潜在问题:你的
SimpleDateFormat默认使用设备本地时区(GMT+03:30),如果解析时输入的日期字符串被宽松处理(SimpleDateFormat默认是宽松模式),或时区映射出现偏差,可能导致解析出的时间戳对应到本地时区的2月15日,但核心问题是你没有对Date进行格式化输出,而是直接打印了它的默认字符串形式。
正确实现"2023-2-14"转"2023-02-14"的方法
要完成日期格式转换,需分两步:用匹配输入的格式解析字符串,再用目标格式重新格式化。另外不推荐使用SimpleDateFormat(线程不安全),Android中优先用Java 8+的java.time API(API 26+兼容,低版本可依赖ThreeTenABP)。
推荐方案:使用java.time API
// 定义输入格式,匹配"2023-2-14"这种单月/单日的格式 val inputFormatter = DateTimeFormatter.ofPattern("yyyy-M-dd") // 解析字符串为LocalDate(仅日期,不含时间和时区,避免时区干扰) val localDate = LocalDate.parse(startDateStr, inputFormatter) // 定义目标格式,输出两位月份和日期 val outputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") // 格式化为目标字符串 val formattedDate = localDate.format(outputFormatter) Log.e("dateLog", formattedDate) // 输出:2023-02-14
兼容低版本方案:使用SimpleDateFormat
// 用匹配输入的格式解析,设置UTC时区避免时区偏移 val inputFormat = SimpleDateFormat("yyyy-M-dd") inputFormat.timeZone = TimeZone.getTimeZone("UTC") val date = inputFormat.parse(startDateStr) // 用目标格式格式化,同样设置UTC时区 val outputFormat = SimpleDateFormat("yyyy-MM-dd") outputFormat.timeZone = TimeZone.getTimeZone("UTC") val formattedDate = outputFormat.format(date) Log.e("dateLog", formattedDate) // 输出:2023-02-14
内容的提问来源于stack exchange,提问作者KadKos
相关产品推荐
相关产品推荐

