You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 17:25:29