Java:将字符串日期转换为月份名称年份(MMM yyyy)

14

我是Java的新手。我正在尝试将日期从字符串转换为MMM yyyy格式(Mar 2016)。我尝试了这个方法:

Calendar cal=Calendar.getInstance();
SimpleDateFormat month_date = new SimpleDateFormat("MMM yyyy");
String month_name = month_date.format(cal.getTime());
System.out.println("Month :: " + month_name);  //Mar 2016

它正常运行。但当我使用时

String actualDate = "2016-03-20";

它不起作用。请帮忙,如何解决这个问题。


请在发布问题之前先搜索 Stack Overflow。这些基本的日期时间问题已经被回答了很多次。 - Basil Bourque
如果您只需要年份和月份,请考虑使用 YearMonth 类。传递和使用该类的对象而不是字符串可以获得类型安全、有效值和自我记录代码。内置于Java中,因此您可以在整个代码库中使用。可以按照 Hajaj 的正确答案 中所示的方式进行格式化。 - Basil Bourque
糟糕...我重新打开了这个问题,认为它是关于解析年月字符串的,这不会是链接重复的问题。但是我在这里误读了这个问题,因为它是关于从年月日期对象生成年月字符串的。我不应该重新打开。 - Basil Bourque
3个回答

27

您的格式必须与输入匹配

对于2016-03-20,格式应该是(只需使用第二个SimpleDateFormat对象)

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

完整回答

SimpleDateFormat month_date = new SimpleDateFormat("MMM yyyy", Locale.ENGLISH);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

String actualDate = "2016-03-20";

Date date = sdf.parse(actualDate);

String month_name = month_date.format(date);
System.out.println("Month :" + month_name);  //Mar 2016

使用java.time

String actualDate = "2016-03-20";
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd", Locale.ENGLISH);
DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("MMM yyyy", Locale.ENGLISH);
DateTimeFormatter dtf3 = DateTimeFormatter.ofPattern("MMMM yyyy", Locale.ENGLISH);
LocalDate ld = LocalDate.parse(actualDate, dtf);
String month_name = dtf2.format(ld);
System.out.println(month_name); // Mar 2016
String fullMonthAndYear = dtf3.format(ld);
System.out.println(fullMonthAndYear); // March 2016

谢谢回复。但是如何将“2016-03-20”转换为“Mar 2016”? - Nagarjuna Reddy
1
@N123 首先使用“yyyy-MM-dd”格式的格式化程序解析字符串“2016-03-20”,然后再使用“MMM yyyy”格式的格式化程序将结果转换。 - Alex Salauyou
@SashaSalauyou 谢谢,老兄。我添加了答案。 - Yassin Hajaj
2
输入字符串符合ISO 8601标准,这是java.time默认使用的。因此无需定义模式。LocalDate ld = LocalDate.parse( "2016-03-20" ); - Basil Bourque
2
同意。在解析的特定情况下,“Locale”是可选的。但是,明确指定“Locale”始终是一个明智的习惯,如此处所示,而不是隐式依赖于JVM的当前默认设置。 - Basil Bourque
显示剩余3条评论

6

尝试使用这段代码:

DateFormat df = new SimpleDateFormat("dd-MMMM HH:mm a");
Date date = new Date(System.currentTimeMillis());
String infi = df.format(date);

输出应该是:

11-May 4:47 PM

1
请注意,像java.util.Datejava.util.Calendarjava.text.SimpleDateFormat这样的日期时间类现在已经成为遗留系统,被内置于Java 8及更高版本中的java.time类所取代。请参阅Oracle的教程 - Basil Bourque

5

简而言之

YearMonth.from( 
    LocalDate.parse( "2016-03-20" )
) 
.format(
    DateTimeFormatter.ofPattern( 
        "MMM uuuu" , 
        Locale.US 
    )
)

2016年3月

java.time

避免使用麻烦的旧日期时间类,完全被java.time类所取代。
YearMonth
Java有一个表示年份和月份的类。奇怪的命名为YearMonth。
LocalDate ld = LocalDate.parse( "2016-03-20" ) ;
YearMonth ym = YearMonth.from( ld ) ;

定义所需输出的格式化模式。

指定一个LocaleLocale确定(a)用于翻译星期几、月份名称等人类语言,以及(b)决定缩写、大写、标点、分隔符等文化规范的问题。

DateTimeFormatter f = DateTimeFormatter.ofPattern( "MMM uuuu" , Locale.US ) ;
String output = ym.format( f ) ;

2016年3月

你可以在 LocalDate 上使用该格式化程序。但我假设你可能需要将年月作为一个概念进一步使用,因此 YearMonth 类可能会有用。


关于java.time

java.time框架内置于Java 8及以上版本。这些类取代了老旧的遗留日期时间类,如java.util.Date, Calendar, & SimpleDateFormat

Joda-Time项目现在处于维护模式,建议迁移到java.time类。

要了解更多信息,请参阅Oracle教程。并在Stack Overflow上搜索许多示例和解释。规范是JSR 310

您可以直接与数据库交换java.time对象。使用符合JDBC 4.2或更高版本的JDBC驱动程序。不需要字符串,也不需要java.sql.*类。

如何获取java.time类?

ThreeTen-Extra项目扩展了java.time的附加类。该项目是java.time可能未来添加的可能性的试验场。您可能会在这里找到一些有用的类,例如Interval, YearWeek, YearQuarter更多


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接