在 Java 中将冒号添加到 24 小时制



我有一个格式为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*

我将通过以下步骤解决它:

  1. 将日期字符串解析为LocalDate
  2. 将时间字符串解析为LocalTime
  3. LocalDateLocalTime的对象结合起来,得到一个LocalDateTime的对象。
  4. 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'

目标

  1. 使用您拥有的格式将字符串转换为日期
  2. 以所需的格式将该日期输出为字符串

法典:

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

相关内容

  • 没有找到相关文章

最新更新