处理日式年月日期(2020年7月)时SimpleDateFormat输出错误求助
问题分析与解决
哦,这个坑我之前也踩过!你遇到的问题核心是把YYYY和yyyy搞混了——这俩写法看起来差不多,但实际含义差老远了:
YYYY代表的是周年份(Week Year):它是按周来划分的年份,一年的第一周必须包含该年的第一个周四(不同地区规则可能略有差异),所以12月底的部分日期可能会被归到下一年的周年份,年初的部分日期也可能被算到上一年的周年份里。yyyy代表的是日历年(Calendar Year):就是我们日常用的、按1月1日到12月31日划分的常规年份。
你用YYYY来解析和格式化日期,就会让程序错误地把日期关联到周年份的周期里,最终输出了完全不对的月份。
修正后的代码
把所有的YYYY替换成yyyy就能解决问题:
val inputFormat = SimpleDateFormat("yyyy年M月") val date = inputFormat.parse("2020年7月") val outputText = SimpleDateFormat("yyyy/MM").format(date)
运行这段代码后,输入“2020年7月”就会正确输出2020/07啦。
额外小建议
如果你是在Android 8.0+或者Java 8及以上环境开发,非常推荐使用java.time包下的新日期API(比如DateTimeFormatter、LocalDate)——它的设计更清晰,完全避免了SimpleDateFormat的线程不安全问题,也不容易出现这类格式符混淆的情况:
import java.time.LocalDate import java.time.format.DateTimeFormatter val inputFormatter = DateTimeFormatter.ofPattern("yyyy年M月") val date = LocalDate.parse("2020年7月", inputFormatter) val outputText = date.format(DateTimeFormatter.ofPattern("yyyy/MM"))
新API用起来更省心,以后处理日期相关的需求可以优先考虑它~
内容的提问来源于stack exchange,提问作者user3813146
相关产品推荐
相关产品推荐

