【问题标题】:Java: Convert String Date to Month Name Year (MMM yyyy) [duplicate]Java:将字符串日期转换为月份名称年份(MMM yyyy)[重复]
【发布时间】:2016-03-20 12:13:23
【问题描述】:

我是 Java 新手。我正在尝试将日期从字符串转换为 MMM yyyy 格式(2016 年 3 月)。我试过这个

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。这些基本的日期时间问题已被多次回答。
  • 如果您只需要一年和一个月,请考虑使用YearMonth 类。传递和使用此类的对象而不是字符串可以获得类型安全、有效值和自记录代码。内置于 Java 中,因此您可以在整个代码库中使用。可以按照correct Answer by Hajaj中所示的相同方式进行格式化。
  • 哎呀......我重新打开了这个问题,以为它是关于解析一个年月字符串,它不是链接的副本的副本。但我在这里误读了这个问题,因为它是关于从年月日对象生成年月字符串。我不应该重新打开。

标签: java date


【解决方案1】:

您的格式必须与您的输入相匹配

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);
LocalDate ld = LocalDate.parse(actualDate, dtf);
String month_name = dtf2.format(ld);
System.out.println(month_name); // Mar 2016

【讨论】:

  • 感谢您的回复。但是如何将“2016-03-20”转换为 Mar 2016
  • @N123 首先使用“yyyy-MM-dd”模式的格式化程序解析字符串“2016-03-20”,然后使用“MMM yyyy”的格式化程序转换结果
  • @SashaSalauyou 谢谢。我添加了答案
  • 输入字符串符合 ISO 8601 标准,在 java.time 中默认使用。所以不需要定义模式。 LocalDate ld = LocalDate.parse( "2016-03-20" );
  • 同意。此外,Locale 在这种特殊的解析情况下是可选的。但始终明确指定 Locale 是一个明智的习惯,如此处所示,而不是隐式依赖 JVM 的当前默认值。
【解决方案2】:

试试这个代码:

    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

【讨论】:

【解决方案3】:

tl;博士

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 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

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

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

从哪里获得 java.time 类?

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 2016-03-09
    • 2012-01-24
    • 2017-01-27
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    相关资源
    最近更新 更多