将字符串转换为 java 中的日期,格式为 2012-07-27

Posted

技术标签:

【中文标题】将字符串转换为 java 中的日期,格式为 2012-07-27【英文标题】:convert string to date in java in format 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。 【参考方案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 类?

Java SE 8SE 9 及更高版本 内置。 标准 Java API 的一部分,带有捆绑实现。 Java 9 添加了一些小功能和修复。 Java SE 6SE 7 ThreeTen-Backport 中的大部分 java.time 功能都向后移植到 Java 6 和 7。 Android ThreeTenABP 项目专门为 android 适配 ThreeTen-Backport(如上所述)。 见How to use ThreeTenABP…

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

【讨论】:

以上是关于将字符串转换为 java 中的日期,格式为 2012-07-27的主要内容,如果未能解决你的问题,请参考以下文章

在 db2 中将字符串日期(yyyy/mm/dd)转换为日期格式

将 Java 日期转换为 XML 日期格式(反之亦然)

java中如何将字符串转换成日期型

如何将 Java 日期字符串/对象转换为 JFreeChart 日期格式?

使用 java 8 和格式将字符串转换为日期 -> 'uuuu-MM-dd'

java字符串转换成日期