在Java中添加冒号到24小时的时间?

时间:2013-12-31 19:50:54

标签: java date time datetime-format valueconverter

我的日期格式为 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”

7 个答案:

答案 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 的解决方案。

java.time

旧的日期时间 API(java.util 日期时间类型及其格式 API,SimpleDateFormat)已经过时且容易出错。建议完全停止使用,改用java.timemodern date-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

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

目标

  1. 使用
  2. 中的格式将字符串转换为日期
  3. 以您想要的格式输出该日期作为字符串
  4. 代码:

    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