如何在java中将字符串转换为日期对象

How to convert string to date object in java

本问题已经有最佳答案,请猛点这里访问。

我有一个这种格式的字符串String oldstring ="Mar 19 2018 - 14:39";

如何将此字符串转换为Java对象,以便从日期对象获得时间和分钟。

我试过这样,

1
2
3
4
5
6
7
8
9
10
11
12
import java.util.Date;
import java.text.SimpleDateFormat;
import java.text.ParseException;

public class DateEg {
    public static final void main(String[] args) {
        SimpleDateFormat localDateFormat = new SimpleDateFormat("HH:mm");
    String oldstring ="Mar 19 2018 - 14:39";
        String time = localDateFormat.format(oldstring);
        System.out.println(time);
    }
}

但得到错误,说Cannot format given Object as a Date

1
2
3
4
Exception in thread"main" java.lang.IllegalArgumentException: Cannot format given Object as a Date
    at java.base/java.text.DateFormat.format(DateFormat.java:332)
    at java.base/java.text.Format.format(Format.java:158)
    at DateEg.main(DateEg.java:9)

在Java中解析这个字符串格式是可能的吗?


DR

1
2
3
4
5
6
LocalDateTime.parse(                   // Parse as a `LocalDateTime` because the input lacks indication of zone/offset.
   "Mar 19 2018 - 14:39" ,
    DateTimeFormatter.ofPattern("MMM dd uuuu - HH:mm" , Locale.US )
)                                      // Returns a `LocalDateTime` object.
.toLocalTime()                         // Extract a time-of-day value.
.toString()                            // Generate a String in standard ISO 8601 format.

14:39

Java.时间

现代方法使用java.time类。

定义与输入匹配的格式模式。指定Locale以确定解析此本地化输入字符串时使用的人类语言和文化规范。

1
2
3
String input ="Mar 19 2018 - 14:39" ;
Locale locale = Locale.US ;  // Specify `Locale` to determine human language and cultural norms used in parsing this localized input string.
DateTimeFormatter f = DateTimeFormatter.ofPattern("MMM dd uuuu - HH:mm" , locale ) ;

分析为LocalDateTime,因为输入缺少时区或与UTC的偏移量的任何指示器。

1
LocalDateTime ldt = LocalDateTime.parse( input , f  );

提取一天中的时间值,不带日期和时区,因为这是问题的目标。

1
LocalTime lt = ldt.toLocalTime();

ldt.toString(): 2018-03-19T14:39

lt.toString(): 14:39

国际标准化组织8601

你输入的格式很糟糕。将日期时间值序列化为文本时,请始终使用标准ISO 8601格式。

在解析/生成字符串时,java.time类默认使用标准的iso8601格式。你可以在这个答案中看到上面的例子。

关于JavaTimes

JavaTimeFr框架是在Java 8和之后构建的。这些类取代了麻烦的旧遗留日期时间类,如java.util.DateCalendar、&SimpleDateFormat

现在处于维护模式的joda time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle教程。以及搜索堆栈溢出以获得许多示例和解释。规格为JSR 310。

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

在哪里获取java.time类?

  • Java SE 8、Java SE 9及以后
    • 内置的。
    • 标准JAVA API的一部分与捆绑实现。
    • Java 9添加了一些小的特性和修复。
  • Java SE 6和Java SE 7
    • 大部分JavaTimeActudio都被移植到TealEnter后端的Java 6和7中。
  • 安卓
    • java.time类的Android包实现的更高版本。
    • 对于早期的Android(<26),threetenabp项目适应threeten backport(如上所述)。看看如何使用三连珠……

threeten额外项目使用额外的类扩展java.time。这个项目是将来可能添加到java.time的一个试验场。您可以在这里找到一些有用的类,如IntervalYearWeekYearQuarter等等。


使用正确的格式化程序对下面提到的字符串进行分析

1
2
3
4
5
6
7
8
    SimpleDateFormat localDateFormat = new SimpleDateFormat("MMM dd yyyy - HH:mm");
    String oldstring ="Mar 19 2018 - 14:39";
    Date date=localDateFormat.parse(oldstring);
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    int hours = calendar.get(Calendar.HOUR_OF_DAY);
    int minutes = calendar.get(Calendar.MINUTE);
    int seconds = calendar.get(Calendar.SECOND);


尝试使用这个,应该可以:

1
2
3
4
5
DateTimeFormatter formatter = DateTimeFormat.forPattern("MMM dd yyyy - HH:mm");
LocalDateTime dt = formatter.parse(oldstring);`

DateTimeFormatter timeFormat = DateTimeFormatter.ofPattern("HH:mm");
String time = timeFormat.format(dt).toString();`


如果您可以使用外部库,那么ApacheCommonDateUtils提供了许多实用程序类,您可以使用它们来处理日期。为了将字符串解析为对象,可以使用以下示例:

1
public static&nbsp;Date&nbsp;parseDate(String&nbsp;str, Locale&nbsp;locale, String...&nbsp;parsePatterns) throws ParseException

Parses a string representing a date by trying a variety of different
parsers, using the default date format symbols for the given locale.

The parse will try each parse pattern in turn. A parse is only deemed
successful if it parses the whole of the input string. If no parse
patterns match, a ParseException is thrown.

The parser will be lenient toward the parsed date.

Parameters:str - the date to parse, not nulllocale - the locale whose
date format symbols should be used. If null, the system locale is used
(as per parseDate(String, String...)).parsePatterns - the date format
patterns to use, see SimpleDateFormat, not nullReturns:the parsed
dateThrows:IllegalArgumentException - if the date string or pattern
array is nullParseException - if none of the date patterns were
suitable (or there were none)Since:3.2