【问题标题】:convert string to date in java in format 2012-07-27将字符串转换为 java 中的日期,格式为 2012-07-27
【发布时间】:2012-09-06 12:57:41
【问题描述】:

我的输入字符串为 2012-07-27,我希望输出为日期,但格式与 2012-07-27 相同

我的代码是

DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

    try {
        Date today = df.parse("20-12-2005");
        System.out.println("Today = " + df.format(today));

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

我的输出是

Fri Jul 27 00:00:00 IST 2012

但我想返回日期对象,例如 2012-07-26 23:59:59 而不是字符串,请提供任何帮助

任何帮助都非常感谢充分

【问题讨论】:

  • 日期没有格式。
  • 使用format方法代替`parse'
  • 听起来你已经拥有你想要的字符串了。您正在尝试从“2012-07-27”转到“2012-07-27”-我在这里缺少什么?
  • 仅供参考,麻烦的旧日期时间类,如 java.util.Datejava.util.Calendarjava.text.SimpleDateFormat 现在是 legacy,被 Java 8 和 Java 中内置的 java.time 类所取代9. 见Tutorial by Oracle

标签: java


【解决方案1】:

您可以使用与解析日期相同的SimpleDateFormat,将日期格式化为字符串。

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Date date1 = formatter.parse("2012-07-27");
System.out.println(date1); // prints Fri Jul 27 00:00:00 IST 2012
System.out.println(formatter.format(date1)); // prints 2012-07-26

【讨论】:

  • 谢谢,但我想返回日期对象而不是像 2012-07-26 23:59:59 这样的字符串,请提供任何帮助
【解决方案2】:

首先,我认为重要的是要注意System.out.println 隐式调用其参数的toString 方法。参数必须是 Object 或其子类。而DateObject 的子类。话虽如此,看看 1.7 Date#toString 的实现,

public String toString() {
        // "EEE MMM dd HH:mm:ss zzz yyyy";
        BaseCalendar.Date date = normalize();
        StringBuilder sb = new StringBuilder(28);
        int index = date.getDayOfWeek();
        if (index == gcal.SUNDAY) {
            index = 8;
        }
        convertToAbbr(sb, wtb[index]).append(' ');                        // EEE
        convertToAbbr(sb, wtb[date.getMonth() - 1 + 2 + 7]).append(' ');  // MMM
        CalendarUtils.sprintf0d(sb, date.getDayOfMonth(), 2).append(' '); // dd

        CalendarUtils.sprintf0d(sb, date.getHours(), 2).append(':');   // HH
        CalendarUtils.sprintf0d(sb, date.getMinutes(), 2).append(':'); // mm
        CalendarUtils.sprintf0d(sb, date.getSeconds(), 2).append(' '); // ss
        TimeZone zi = date.getZone();
        if (zi != null) {
            sb.append(zi.getDisplayName(date.isDaylightTime(), zi.SHORT, Locale.US)); // zzz
        } else {
            sb.append("GMT");
        }
        sb.append(' ').append(date.getYear());  // yyyy
        return sb.toString();
    }

Date 对象的字符串表示形式指定为EEE MMM dd HH:mm:ss zzz yyyy。这正是您所看到的。

如果您想以不同的格式显示Date 对象,请使用SimpleDateFormat 类。它的唯一目的是为 Date 对象表示为字符串的方式增加灵活性。


还有...

一种可能但荒谬的解决方法是创建自己的包装类,

public class MyDate{
    private final Date d;
    private final SimpleDateFormat sdf;

    public(Date d, SimpleDateFormat sdf){
        this.d = d;
        this.sdf = sdf;
    }

    // not recommended...should only be used for debugging purposes
    @Override
    public String toString(){
        return sdf.format(d);
    }
}

【讨论】:

    【解决方案3】:

    您必须使用另一个具有所需输出格式的SimpleDateFormat (format())

    【讨论】:

      【解决方案4】:

      您可以使用相同的SimpleDateFormat 获取日期的String 表示。 format 方法是这样做的:

      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
      Date date1 = sdf.parse("2012-07-27");
      System.out.println(sdf.format(date1);
      

      【讨论】:

        【解决方案5】:
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date date = dateFormat.parse("2012-07-27");
        System.out.println(dateFormat.format(date));
        

        【讨论】:

          【解决方案6】:

          java.util.Date 中没有“格式”属性。 Date 实例是一个相当简单的对象,代表一个时刻(实际上,它的状态仅由它内部存储的 unix 时间戳定义)。

          正如其他人所说,使用(例如)SimpleDateFormatDate 实例打印为字符串。

          【讨论】:

            【解决方案7】:

            tl;博士

            LocalDate.parse( "2012-07-27" )
                     .toString()
            

            2012-07-27

            详情

            现代方法是使用 java.time 类。

            LocalDate 类表示没有时间和时区的仅日期值。

            标准格式

            您的输入字符串格式恰好符​​合ISO 8601 标准。 java.time 类在解析/生成表示日期时间值的字符串时默认使用 ISO 8601 格式。所以根本不需要指定格式模式。

            LocalDate ld = LocalDate.parse( "2012-07-27" );
            

            不要将日期时间对象与表示其值的字符串混为一谈。日期时间类/对象可以解析一个字符串并生成一个字符串,但String始终是一个单独且不同的对象。

            String output = ld.toString();
            

            2012-07-27

            自定义格式

            如果您的输入是非标准的,请定义一个 DateTimeFormatter 来匹配。

            String input = "20-12-2005" ;
            DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd-MM-uuuu" ) ;
            LocalDate ld = LocalDate.parse( input , f ) ;
            

            ld.toString(): 2012-07-27


            关于java.time

            java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

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

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

            从哪里获得 java.time 类?

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

            【讨论】:

              猜你喜欢
              • 2019-11-10
              • 2013-12-28
              • 1970-01-01
              • 2014-09-23
              • 1970-01-01
              • 2014-01-18
              • 2019-10-13
              相关资源
              最近更新 更多