从日期字符串中提取时间

52

如何将日期字符串"2010-07-14 09:00:02"格式化为"9:00"

7个回答

118
使用DateTimeFormatter将日期字符串和真实的LocalDateTime对象相互转换。从LocalDateTime开始,你可以根据DateTimeFormatter的Javadoc中定义的各种模式轻松应用格式化。
String originalString = "2010-07-14 09:00:02";
LocalDateTime dateTime = LocalDateTime.parse(originalString, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
String newString = DateTimeFormatter.ofPattern("H:mm").format(dateTime); // 9:00

如果你还没有使用Java 8或更新的版本,请使用SimpleDateFormat将日期字符串转换为真正的Date对象。有了一个Date对象作为起点,你可以根据在 SimpleDateFormat的Javadoc中定义的各种模式轻松应用格式化。

String originalString = "2010-07-14 09:00:02";
Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(originalString);
String newString = new SimpleDateFormat("H:mm").format(date); // 9:00

你好,如果我有一个Unix时间戳,比如1279080000,是否也可以将其格式化为小时:分钟的形式?我尝试了之前帖子中提到的方法,但没有成功。谢谢。 - JJunior
你可以使用毫秒级的时间戳构建一个新的 Date 对象,然后将其格式化。如果你实际上是从数据库检索数据,你应该使用 ResultSet#getTimestamp() 方法获取一个 Date,如 你之前的一个问题 中所回答的那样。或者更好的方法是利用 SQL 内置的日期/时间函数返回已经按照所需格式排列的时间戳,这样就不需要在 Java 中昂贵地重新组织每一行数据了。在这种情况下,只需使用 ResultSet#getString() 获取小时即可。使用正确的工具来完成工作。 - BalusC
1
我正在从数据库中获取数据。 但需要生成打印报告。 所以想循环遍历值并实时更改它们。 因为最终只需要将其打印出来。但无法以任何直接的方式完成 :( - JJunior
@BalusC 有没有一种方法可以根据手机偏好,在用户的手机格式中显示时间,例如上午/下午或24小时制,而无需设置默认值如“H:mm”? - Banana
如何获取 AM/PM - Faizan Mubasher
@FaizanMubasher:如之前所回答的,您可以根据SimpleDateFormat的Javadoc中定义的各种模式轻松应用格式。 (单击蓝色代码链接以获取Javadoc)。 - BalusC

14

13

5

在问题被提出时,其他答案是好的。然而时间流逝,DateSimpleDateFormat这些类已经被更新更好的类取代并且已经不再使用。所以在2017年,请使用java.time包中的类来完成相关任务:

    String timeString = LocalDateTime.parse(dateString, DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss"))
            .format(DateTimeFormatter.ofPattern("H:mm"));

结果是所期望的,9:00

4

1
“H:mm” 不是更合理的选择吗? - Joey
即使字符串最初不是“Date”对象,您也可以使用SimpleDateFormat.parse()将其转换为一个对象,如BalusC的示例所示。 - Andrzej Doyle
1
确实,如果没有AM/PM标记(a),您更喜欢使用H而不是h,以避免在上午9:00和下午9:00之间产生歧义。 - BalusC

3
如果你的日期是整数,你可以像这样使用:
Date date = new Date();
date.setYear(2010);
date.setMonth(07);
date.setDate(14)
date.setHours(9);
date.setMinutes(0);
date.setSeconds(0);
String time = new SimpleDateFormat("HH:mm:ss").format(date);

1
请解释您的答案,使其他读者更加清楚。 - Mohit Jain
如果你喜欢的话,可以使用07代表八月,但请注意08或09不能代表九月或十月。0前缀表示这个数字是八进制的。 - Ole V.V.
还要注意,如果你想匹配问题中的日期“2010-07-14”,那么你错过了。Date 的月份是从 0 开始计数的,所以你得到的是八月,而不是七月。你可能会认为,由于你只输出时间,这并不重要,但它肯定会让一些人感到困惑。此外,请注意,自 Java 1.1 起,setXx 方法已被弃用,因为它们在不同的时区中不可靠。 - Ole V.V.

0
let datestring = "2017-02-14 02:16:28"

let formatter = DateFormatter()
formatter.dateStyle = DateFormatter.Style.full
formatter.timeStyle = DateFormatter.Style.full

formatter.dateFormat = "yyyy-MM-dd hh:mm:ss"

let date = formatter.date(from: datestring)
let date2 = formatter.String(from: date)

1
针对Swift 3的内容。 - BHAVIK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接