Добавить двоеточие в 24-часовое время на Java?

У меня дата в формате ММ / ДД / ГГГГ и время в формате ЧЧММ (24-часовое время без двоеточия). Обе эти строки находятся в массиве. Я хотел бы сохранить это как одну строку - возможно, что-то вроде «ММ-ДД-ГГГГ ЧЧ: ММ» - и затем иметь возможность преобразовать ее в письменную дату, например «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);

Однако вот что я получаю: «Вс, 29 декабря, 23:01:00 EST 2013».

Результат, который я ищу: «29 декабря 2013 г. 23:01».


person user3015565    schedule 31.12.2013    source источник
comment
Что вы пробовали до сих пор? покажи нам код. e   -  person kosa    schedule 31.12.2013
comment
Спасибо, Джош Шум. Оставьте это на будущее. Если ваше имя так важно для вас, отредактируйте свой профиль.   -  person Andrew Thompson    schedule 31.12.2013
comment
Я пока ничего не пробовал. Я думал об использовании временной метки unix, но не совсем уверен, что будет наиболее эффективным.   -  person user3015565    schedule 31.12.2013
comment
Какого рода исследования вы выполнили перед размещением здесь своего вопроса? Пожалуйста, поделитесь с нами вашими предварительными результатами.   -  person PM 77-1    schedule 31.12.2013
comment
Я пока ничего не пробовал. Лучше сначала попробовать что-нибудь, что может помочь вам облегчить вашу жизнь.   -  person kosa    schedule 31.12.2013
comment
Ознакомьтесь с одним из связанных вопросов которые появляются справа   -  person cklab    schedule 31.12.2013


Ответы (7)


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();
        }
    }

Результат:

31 декабря 2013 года в 12:30

person StoopidDonut    schedule 31.12.2013

К сожалению, ни в одном из существующих ответов не упоминается основная причина проблемы:

  • Вы использовали D (который указывает День в году) вместо d (День в месяце).
  • Вы использовали Y (который указывает год недели) вместо y (год).

Подробнее об этом можно узнать на странице документации. . Теперь, когда вы поняли основную причину проблемы, давайте сосредоточимся на решении с использованием лучшего стандартного API того времени.

java.time

Устаревший API даты и времени (java.util типы даты и времени и их API форматирования, SimpleDateFormat) устарел и подвержен ошибкам. Рекомендуется полностью отказаться от его использования и перейти на java.time, современный API даты и времени *.

Я бы решил это, выполнив следующие шаги:

  1. Разберите строку даты в LocalDate.
  2. Разберите строку времени в LocalTime.
  3. Объедините объекты LocalDate и LocalTime, чтобы получить объект 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 даты и времени * из Trail: Date Time.


* По любой причине, если вам нужно придерживаться Java 6 или Java 7, вы можете использовать ThreeTen-Backport, который поддерживает большую часть функций java.time для Java 6 и 7. Если вы работаете над проектом Android и ваш уровень API Android по-прежнему не соответствует Java-8, проверьте API Java 8+ доступно через удаление сахара и Как использовать ThreeTenABP в Android Project.

person Arvind Kumar Avinash    schedule 08.05.2021

Вы можете использовать класс java.text.DateFormat для преобразования даты в строку (метод форматирования) и строку в дату (метод анализа).

person Bharath    schedule 31.12.2013

Вы можете использовать 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'

person David S.    schedule 31.12.2013

Цель

  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
person Brian    schedule 31.12.2013

вы можете использовать это >>

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

}

}

person dhanushkac    schedule 01.01.2014

Вам следовало немного поискать перед публикацией. На StackOverflow.com уже есть много таких вопросов и ответов.

Но для потомков, вот пример кода с использованием библиотеки Joda-Time 2.3. Избегайте классов java.util.Date/Calendar, связанных с Java, поскольку они плохо спроектированы и реализованы. В Java 8 продолжайте использовать Joda-Time или переключитесь на новый java.time. * классы, определенные JSR 310: 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
person Basil Bourque    schedule 01.01.2014