Добавяне на двоеточие към 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);

Ето какво обаче получавам: „Sun Dec 29 23:01:00 EST 2013“

Изходът, който търся, е: „29 декември 2013 г. 23:01“


person user3015565    schedule 31.12.2013    source източник
comment
Какво сте опитвали досега? покажи ни малко код.д   -  person kosa    schedule 31.12.2013
comment
Благодаря, Джош Нойс. Оставете го в бъдеще. Ако името ви е толкова важно за вас, редактирайте профила си.   -  person Andrew Thompson    schedule 31.12.2013
comment
Не съм опитвал нищо досега. Мислил съм да използвам unix timestamp, но не съм съвсем сигурен кое би било най-ефективно.   -  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 е пътят; за да анализирате вашите низове в необходимите смислени формати за дата и час и накрая да отпечатате вашата дата като задължителен низ.

Вие определяте двата формата, както следва:

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 ч

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 и вашето Android API ниво все още не е съвместимо с Java-8, проверете Java 8+ APIs достъпно чрез обеззахаряване и Как да използвам 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);

Ето пълния код >>

импортиране на java.text.SimpleDateFormat; импортиране на 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);

}

}

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