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

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

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

我试过这样,

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。

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中解析这个字符串格式是可能的吗?

您的格式掩码已关闭。您指定的掩码只有小时和分钟,但时间戳远不止这些。

你的题目是"将字符串转换为日期"。您确定要使用format而不是parse吗?

我们将对象格式化为文本,将文本解析为对象。

我对格式和解析有误解。谢谢@ PSHEMO

@词典编号。我要分析字符串。

@然后阿伦打电话给parse。

FYY,麻烦的旧日期时间类,如EDCOX1,3,EDCOX1,4,EDCX1,5,都是遗留的,被Java.Times类替换为Java 8和更高版本。请参见Oracle教程。

DR
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以确定解析此本地化输入字符串时使用的人类语言和文化规范。

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的偏移量的任何指示器。

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

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

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.Date、Calendar、&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的一个试验场。您可以在这里找到一些有用的类,如Interval、YearWeek、YearQuarter等等。

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

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);

如何只从日期对象获取小时和分钟?

@阿伦看我编辑的答案

FYY,麻烦的旧日期时间类,如EDCOX1,3,EDCOX1,4,EDCX1,5,都是遗留的,被Java.Times类替换为Java 8和更高版本。请参见Oracle教程。

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

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();`

您可能应该提到第一个版本使用了joda-time API:joda.org/joda-time/apidocs

@D.J.Brown或java.time.format。

我提交了一个编辑建议来引用,只是等待批准。

@拉西科尔,不,那是乔达。等价的java.time.format类称为DateTimeFormatter。

@阿伦,我已经编辑了答案,看看这个吧。

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

public static Date parseDate(String str, Locale locale, String... 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

这个功能现在内置于Java 8和以后,在JavaTimes类中。