我的日期格式为 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);
然而,这就是我得到的:“Sun Dec 29 23:01:00 EST 2013”
我要找的输出是:“2013年12月29日23:01”
答案 0 :(得分:2)
SimpleDateFormat
是要走的路;以所需的有意义的日期和时间格式解析您的字符串,最后将您的日期打印为必需的字符串。
您可以按如下方式指定2种格式:
SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
SimpleDateFormat timeFormat = new SimpleDateFormat("HHmm");
考虑一个简单的硬编码日期和时间数组(不是最好的展示方式,但你的问题称它为数组):
String[] array = { "12/31/2013", "1230" };
您必须在Calendar实例中设置这些已解析的日期:
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();
}
}
输出:
2013年12月31日12:30
答案 1 :(得分:1)
不幸的是,现有的答案都没有提到问题的根本原因,如下所示:
D
(指定年中的天)而不是 d
(月中的天)。Y
(指定了周年)而不是 y
(年)。在 documentation 页面了解更多信息。现在您已经了解了问题的根本原因,让我们专注于使用当时最好的标准 API 的解决方案。
旧的日期时间 API(java.util
日期时间类型及其格式 API,SimpleDateFormat
)已经过时且容易出错。建议完全停止使用,改用java.time
,modern date-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
从 modern date-time API 中了解有关 Trail: Date Time* 的更多信息。
* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring 和 How to use ThreeTenABP in Android Project。
答案 2 :(得分:0)
您可以使用java.text.DateFormat类将日期转换为字符串(格式方法),将字符串转换为日期(解析方法)。
答案 3 :(得分:0)
您可以使用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
“
答案 4 :(得分:0)
目标
代码:
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
答案 5 :(得分:0)
您可以使用此>>
String s = sd.format(d);
String s1 = sd1.format(d);
这是完整代码>>
import java.text.SimpleDateFormat; import java.util.Date;
public class 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);
}
}
答案 6 :(得分:0)
在张贴之前,你应该费心去做一些搜索。 StackOverflow.com已经有很多这样的问题和答案。
但是为了子孙后代,这里有一些使用Joda-Time 2.3库的示例代码。避免与Java捆绑的java.util.Date/Calendar类,因为它们设计和实现都很糟糕。在Java 8中,继续使用Joda-Time或切换到java.time.* classes定义的新JSR 310: Date and Time API。这些新课程的灵感来自Joda-Time,但完全是重新设计的。
Joda-Time有许多旨在格式化输出的功能。 Joda-Time提供内置标准(ISO 8601)格式。某些类使用适合主机计算机语言环境的格式和语言呈现字符串,或者您可以指定语言环境。 Joda-Time也可以让您定义自己的时髦格式。搜索“joda”+“format”会得到很多例子。
// © 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