我有一个格式为MM/DD/YYYY的日期和格式为HHMM的时间(24 小时制时间,不含冒号)。 这两个字符串都在数组中。 我想将其存储为一个字符串 - 也许类似于">MM-DD-YYYY HH:MM" -然后能够将其转换为书面日期,例如"1 月 1, 2014 16:15">当我向用户显示它时。 我该怎么做?
这是我的代码:
String date = "05/27/2014 23:01";
Date df = new SimpleDateFormat("MM/DD/YYYY HH:mm").parse(date);
System.out.println(df);
然而,这就是我得到的:"2013 年 12 月 29 日星期日 23:01:00 EST
"我正在寻找的输出是:"十二月 29, 2013 23:01">
SimpleDateFormat
是要走的路;以所需的有意义的日期和时间格式解析字符串,最后将日期打印为必需的字符串。
您可以指定 2 种格式,如下所示:
SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
SimpleDateFormat timeFormat = new SimpleDateFormat("HHmm");
考虑一个简单的日期和时间硬编码数组(不是最好的显示方式,但您的问题称其为数组):
String[] array = { "12/31/2013", "1230" };
您必须在日历实例中设置这些解析的日期:
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.HOUR, time.getHours());
cal.add(Calendar.MINUTE, time.getMinutes());
最后使用相同的SimpleDateFormat
设置日期格式
SimpleDateFormat newFormat = new SimpleDateFormat("MMMM dd, yyyy 'at' hh:mm");
这是完整的工作代码:
public class DateExample {
public static void main(String[] args) {
SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
SimpleDateFormat timeFormat = new SimpleDateFormat("HHmm");
String[] array = { "12/31/2013", "1230" };
try {
Date date = dateFormat.parse(array[0]);
Date time = timeFormat.parse(array[1]);
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.HOUR, time.getHours());
cal.add(Calendar.MINUTE, time.getMinutes());
SimpleDateFormat newFormat = new SimpleDateFormat(
"MMMM dd, yyyy 'at' hh:mm");
String datePrint = newFormat.format(cal.getTime());
System.out.println(datePrint);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
输出:
十二月 31, 2013 在 12:30
不幸的是,现有的答案都没有提到问题的根本原因如下:
- 您使用了
D
(指定一年中的日期)而不是d
(月份中的日期)。 - 您使用了
Y
(指定周年)而不是y
(年)。
在文档页面上了解更多信息。现在您已经了解了问题的根本原因,让我们专注于使用当时最佳标准 API 的解决方案。
java.time
旧的日期时间 API(java.util
日期时间类型及其格式化 API,SimpleDateFormat
)已过时且容易出错。建议完全停止使用它并切换到java.time
,现代日期时间 API*。
我将通过以下步骤解决它:
- 将日期字符串解析为
LocalDate
。 - 将时间字符串解析为
LocalTime
。 - 将
LocalDate
和LocalTime
的对象结合起来,得到一个LocalDateTime
的对象。 - 将
LocalDateTime
的对象格式化为所需的模式。
使用现代 API 进行演示:
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
// 1. Parse the date string into `LocalDate`.
DateTimeFormatter dateParser = DateTimeFormatter.ofPattern("M/d/u", Locale.ENGLISH);
LocalDate date = LocalDate.parse("01/01/2014", dateParser);
// 2. Parse the time string into `LocalTime`.
DateTimeFormatter timeParser = DateTimeFormatter.ofPattern("HHmm", Locale.ENGLISH);
LocalTime time = LocalTime.parse("1615", timeParser);
// 3. Combine date and time to obtain an object of `LocalDateTime`.
LocalDateTime ldt = date.atTime(time);
// 4. Format the object of `LocalDateTime` into the desired pattern.
DateTimeFormatter dtfOutput = DateTimeFormatter.ofPattern("MMMM d, uuuu HH:mm", Locale.ENGLISH);
String output = dtfOutput.format(ldt);
System.out.println(output);
}
}
输出:
January 1, 2014 16:15
要了解有关现代日期时间 API* 的更多信息,请参阅跟踪:日期时间。
* 出于任何原因,如果你必须坚持使用 Java 6 或 Java 7,你可以使用ThreeTen-Backport,它将大部分java.time功能向后移植到 Java 6 和 7。如果您正在为 Android 项目工作,并且您的 Android API 级别仍然不符合 Java-8,请查看通过脱糖提供的 Java 8+ API 和如何在 Android Project 中使用 ThreeTenABP。
您可以使用java.text.DateFormat类将日期转换为字符串(格式方法),将字符串转换为日期(parse方法)。
您可以使用SimpleDateFormat
将字符串解析为日期,并将日期格式化为字符串。 下面是您的示例:
SimpleDateFormat parser = new SimpleDateFormat("MM/DD/YYYY HH:mm");
SimpleDateFormat formatter = new SimpleDateFormat("MMMM dd, yyyy HH:mm");
String dateString = "05/27/2014 23:01";
Date parsedDate = parser.parse(dateString);
String formattedDateString = formatter.format(parsedDate);
System.out.println("Read String '" + dateString + "' as '" + parsedDate + "', formatted as '" + formattedDateString + "'");
当我运行这个时,我得到:
Read String '05/27/2014 23:01' as 'Sun Dec 29 23:01:00 EST 2013', formatted as 'December 29, 2013 23:01
'
目标
- 使用您拥有的格式将字符串转换为日期
- 以所需的格式将该日期输出为字符串
法典:
String date = "05/27/2014 23:01";
//convert the String to Date based on its existing format
Date df = new SimpleDateFormat("MM/dd/yyyy HH:mm").parse(date);
System.out.println("date " +df);
//now output the Date as a string in the format you want
SimpleDateFormat dt1 = new SimpleDateFormat("MMMM dd, yyyy HH:mm");
System.out.println(dt1.format(df));
输出:
date Tue May 27 23:01:00 CDT 2014
May 27, 2014 23:01
您可以使用此>>
String s = sd.format(d);
String s1 = sd1.format(d);
这是完整的代码>>
导入java.text.SimpleDateFormat; import java.util.Date;
公共类 DT {
public static void main(String[] args) {
// TODO Auto-generated method stub
Date d = new Date();
SimpleDateFormat sd = new SimpleDateFormat("MMMM dd, YYYY");
SimpleDateFormat sd1 = new SimpleDateFormat("HH:mm");
String s = sd.format(d);
String s1 = sd1.format(d);
System.out.println(s +" "+ s1);
}
}
在发布之前,您应该费心进行一些搜索。 StackOverflow.com 已经有很多这样的问题和答案了。
但为了后人着想,这里有一些使用 Joda-Time 2.3 库的示例代码。避免使用与Java捆绑在一起的java.util.Date/Calendar类,因为它们的设计和实现都很糟糕。在 Java 8 中,继续使用 Joda-Time 或切换到由 JSR 310: 日期和时间 API 定义的新的 java.time.* 类。这些新课程的灵感来自Joda-Time,但完全重新设计。
Joda-Time具有许多旨在格式化输出的功能。Joda-Time 提供内置标准 (ISO 8601) 格式。某些类呈现的字符串具有适合主计算机区域设置的格式和语言,或者您可以指定区域设置。Joda-Time还可以让你定义自己的时髦格式。搜索"joda"+"格式"会给你很多例子。
// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.
// import org.joda.time.*;
// import org.joda.time.format.*;
String input = "05/27/2014" + " " + "23:01";
解析该字符串...
// Assuming that string is for UTC/GMT, pass the built-in constant "DateTimeZone.UTC".
// If that string was stored as-is for a specific time zone (NOT a good idea), pass an appropriate DateTimeZone instance.
DateTimeFormatter formatterInput = DateTimeFormat.forPattern( "MM/dd/yyyy HH:mm" ).withZone( DateTimeZone.UTC );
DateTime dateTime = formatterInput.parseDateTime( input );
理想情况下,应以适当的日期时间格式将值存储在数据库中。如果不可能,则以 ISO 8601 格式存储为字符串,设置为 UTC/GMT(无时区偏移)。
// Usually best to write out date-times in ISO 8601 format in the UTC time zone (no time zone offset, 'Z' = Zulu).
String saveThisStringToStorage = dateTime.toDateTime( DateTimeZone.UTC ).toString(); // Convert to UTC if not already in UTC.
通常使用 UTC 进行业务逻辑和存储。仅在应用的用户界面部分切换到本地时区和本地化格式。
// Convert to a localized format (string) only as needed in the user-interface, using the user's time zone.
DateTimeFormatter formatterOutput = DateTimeFormat.mediumDateTime().withLocale( Locale.US ).withZone( DateTimeZone.forID( "America/New_York" ) );
String showUserThisString = formatterOutput.print( dateTime );
转储到控制台...
System.out.println( "input: " + input );
System.out.println( "dateTime: " + dateTime );
System.out.println( "saveThisStringToStorage: " + saveThisStringToStorage );
System.out.println( "showUserThisString: " + showUserThisString );
运行时...
input: 05/27/2014 23:01
dateTime: 2014-05-27T23:01:00.000Z
saveThisStringToStorage: 2014-05-27T23:01:00.000Z
showUserThisString: May 27, 2014 7:01:00 PM