繁体   English   中英

Java日期格式转换 - 月份出错

[英]Java date format conversion - getting wrong month

我在转换 Java 中的日期时遇到问题,不知道我哪里出错了...

    String dateStr = "2011-12-15";
    String fromFormat = "yyyy-mm-dd";
    String toFormat = "dd MMMM yyyy";

    try {
        DateFormat fromFormatter = new SimpleDateFormat(fromFormat);
        Date date = (Date) fromFormatter.parse(dateStr);

        DateFormat toformatter = new SimpleDateFormat(toFormat);
        String result = toformatter.format(date);

    } catch (ParseException e) {
        e.printStackTrace();
    }

输入日期是 2011-12-15,我期望结果是“2011 年 12 月 15 日”,但我得到的结果是“2011 年 1 月 15 日”

我哪里错了?

您的fromFormat使用分钟,而它应该使用几个月。

String fromFormat = "yyyy-MM-dd";

我认为fromFormat应该是“yyyy-MM-dd”。

这是格式:

  • m == 以小时为单位的分钟
  • M == 年中的月份

更多: http : //docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html

查看SimpleDateFormat的 javadoc 并查看m代表什么。 不是你想象的几个月,而是几分钟。

 String fromFormat = "yyyy-MM-dd"; 

从格式应该是:

String fromFormat = "yyyy-MM-dd"

tl;博士

LocalDate.parse( "2011-12-15" )                            // Date-only, without time-of-day, without time zone.
.format(                                                   // Generate `String` representing value of this `LocalDate`. 
    DateTimeFormatter.ofLocalizedDate( FormatStyle.LONG )  // How long or abbreviated?
                     .withLocale(                          // Locale used in localizing the string being generated.
                         new Locale( "en" , "IN" )         // English language, India cultural norms.
                     )                                     // Returns a `DateTimeFormatter` object.
)                                                          // Returns a `String` object.

2011 年 12 月 15 日

时间

虽然接受的答案是正确的(大写MM表示月份),但现在有更好的方法。 麻烦的旧日期时间类现在是遗留的,被 java.time 类取代。

您的输入字符串采用标准ISO 8601格式。 所以不需要为解析指定格式模式。

LocalDate ld = LocalDate.parse( "2011-12-15" );  // Parses standard ISO 8601 format by default.
Locale l = new Locale( "en" , "IN" ) ;  // English in India.
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( FormatStyle.LONG )
                                       .withLocale( l );
String output = ld.format( f );

转储到控制台。

System.out.println( "ld.toString(): " + ld );
System.out.println( "output: " + output );

ld.toString(): 2011-12-15

产出:2011年12月15日

在 IdeOne.com 中查看实时代码


关于java.time

java.time框架内置于 Java 8 及更高版本中。 这些类取代麻烦的老传统日期时间类,如java.util.DateCalendar ,和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 的试验场。 您可以在这里找到一些有用的类,比如IntervalYearWeekYearQuarter ,和更多

SimpleDateFormat m代表分钟,而M代表月份。 因此,您的第一个格式应该是yyyy-MM-dd

那么这可能不是你的情况,但可能会帮助某人。 在我的情况下,转换后,月份的日期和月份设置为 1。所以无论日期是什么,转换后我得到 1 jan,这是错误的。 经过努力,我发现在日期格式中我使用了YYYY而不是yyyy 当我将所有大写 Y 更改为 y 时,它工作正常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM