如何在 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"

【问题讨论】:

一个简单的子字符串和一个条件语句就能帮你搞定 创建两个DateTimeFormatters(一个用于解析输入,另一个用于格式化所需的输出)然后与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 中将列从字符串更改为日期?

如何将整数转换为月和年格式

如何将“YYYYMM”格式转换为“YYYY-MM-00”?

在雅典娜中将 yyyymm 字符串转换为 yyyy-mm-dd hh:mm:ss 日期时间

在java中将RSS pubDate解析为日期对象