如何在 Java 中将 yyyymm 数据格式解析为 Month、YYYY 格式?
Posted
技术标签:
【中文标题】如何在 Java 中将 yyyymm 数据格式解析为 Month、YYYY 格式?【英文标题】:How to parse yyyymm data format to Month, YYYY format in Java? 【发布时间】:2021-08-16 09:39:43 【问题描述】:我有一个等于"202004"
的字符串值。如何在 Java 中将其转换为 "April, 2020"
?
【问题讨论】:
一个简单的子字符串和一个条件语句就能帮你搞定 创建两个DateTimeFormatter
s(一个用于解析输入,另一个用于格式化所需的输出)然后与java.time.YearMonth
结合使用。
为什么要将其转换为April, 2020
?你会用这个字符串做什么?输出到 JSON,显示在 Thymeleaf 网页上,打印到控制台,还有什么?
您标记了您的问题 simpledateformat,但我建议您永远不要使用SimpleDateFormat
。这个类是出了名的麻烦和过时。而是使用来自java.time, the modern Java date and time API, 的DateTimeFormatter
,如deHaar 的非常好的答案中所示。
【参考方案1】:
对于这样的任务,我会使用java.time
。
您可以定义两个java.time.format.DateTimeFormatter
实例(一个用于将输入字符串解析为java.time.YearMonth
,另一个用于将获取的YearMonth
格式化为所需格式的字符串)。
定义一个类似这样的方法:
public static String convert(String monthInSomeYear, Locale locale)
// create something that is able to parse such input
DateTimeFormatter inputParser = DateTimeFormatter.ofPattern("uuuuMM");
// then use that formatter in order to create an object of year and month
YearMonth yearMonth = YearMonth.parse(monthInSomeYear, inputParser);
/*
* the output format is different, so create another formatter
* with a different pattern. Please note that you need a Locale
* in order to define the language used for month names in the output.
*/
DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern(
"MMMM, uuuu",
Locale.ENGLISH
);
// then return the desired format
return yearMonth.format(outputFormatter);
然后使用它,例如在main
方法中:
public static void main(String[] args)
// your example input
String monthInAYear = "202004";
// use the method
String sameMonthInAYear = convert(monthInAYear, Locale.ENGLISH);
// and print the result
System.out.println(sameMonthInAYear);
输出将是这样的:
April, 2020
【讨论】:
【参考方案2】:使用下面一行代码来格式化年月
int yearMonth = Integer.parseInt("202004");
String yearMonthStr = new DateFormatSymbols().getMonths()[(yearMonth % 10)-1] + ", "+yearMonth/100;
System.out.println(yearMonthStr);
【讨论】:
您的代码不正确。我在 2019 年 2 月尝试使用201912
,但您的代码打印为 februar, 2019
。我建议不要自己做日期数学,这太容易出错了。【参考方案3】:
使用 DateFormatSymbols() 类从字符串中实现新的日期格式
String text="202011";
int num=0;
//Checking the last second character of the text for jan to sept month
if(text.charAt(text.length()-2)==0)
num=Integer.parseInt(""+text.charAt(text.length()-1))-1;
else
num=Integer.parseInt(""+text.substring(text.length()-2))-1;
//Checking correct month value
if(num>=0&&num<=11)
String month = "";
DateFormatSymbols date_ = new DateFormatSymbols();
String[] month_name = date_.getMonths();
month = month_name[num];
System.out.println(month+","+text.substring(0,4));
else
System.out.println("Wrong month value");
【讨论】:
好吧,即使存在简单直接的解决方案(请参阅 deHaar 的答案),您当然可以采取漫长而复杂的方式。虽然您可能对此感到满意,但我相信在您之后维护您的代码的人不会这样做。【参考方案4】:SimpleDateFormat oldFormat = new SimpleDateFormat("yyyyMM");
SimpleDateFormat newFormat = new SimpleDateFormat("MMMM, yyyy");
Date date = null;
try
date = oldFormat.parse("202004");
catch (ParseException e)
e.printStackTrace();
String newDateString = newFormat.format(date);
SimpleDateFormat documentation
【讨论】:
请不要教年轻人使用早已过时且臭名昭著的SimpleDateFormat
类。至少不是第一选择。而且不是没有任何保留。我们在java.time
, the modern Java date and time API, 和它的DateTimeFormatter
中做得更好。【参考方案5】:
试试我的代码 sn-p:
SimpleDateFormat inSdf = new SimpleDateFormat("yyyyMM");
Date date = inSdf.parse("202112");
SimpleDateFormat outSdf = new SimpleDateFormat("MMMM, yyyy");
String sDate = outSdf.format(date);
System.out.println(sDate);
结果:
December, 2021
【讨论】:
请不要教年轻人使用早已过时且臭名昭著的SimpleDateFormat
类。至少不是第一选择。而且不是没有任何保留。我们在java.time
, the modern Java date and time API, 和它的DateTimeFormatter
中做得更好。以上是关于如何在 Java 中将 yyyymm 数据格式解析为 Month、YYYY 格式?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SQL 中将 varchar 字段 (YYYYMM) 转换为日期 (MM/01/YY)?
如何在 Amazon Redshift 中将列从字符串更改为日期?