Как преобразовать «2012-03-04 00: 00: 00.0» в дату с форматом «дд-мм-гггг ЧЧ: мм: сс» с помощью Java - PullRequest
7 голосов
/ 04 марта 2012

У меня есть формат даты, который я получаю из базы данных, и это тип String.В нем хранится значение, подобное «2012-03-04 00: 00: 00.0», но я объявил SimpleDateFormat как «dd-MMM-гггг ЧЧ: мм: сс», который необходим в моем проекте.Теперь, когда я получаю некоторые данные, например, дату, из базы данных, я получаю исключение синтаксического анализа с журналом, как показано ниже.

java.text.ParseException: Unparseable date: "2012-03-04 00:00: 00.0 "в java.text.DateFormat.parse (неизвестный источник) в com.tcs.tool.iris.aep.selfProfile.dao.AepSelfProfileDaoImpl $ 1.setValues ​​(AepSelfProfileDaoImpl.java:1188) в org.springfrac.workJdbcTemplate $ 4.doInPreparedStatement (JdbcTemplate.java:892) в org.springframework.jdbc.core.JdbcTemplate $ 4.doInPreparedStatement (JdbcTemplate.java:1) в org.springframeore.j.jt.jd.d.d.d.d.d.dв org.springframework.jdbc.core.JdbcTemplate.execute (JdbcTemplate.java:614) в org.springframework.jdbc.core.JdbcTemplate.batchUpdate (JdbcTemplate.java:883) в себя..dao.AepSelfProfileDaoImpl.insertDataIntoActionItems (AepSelfProfileDaoImpl.java:1174) в com.tcs.tool.iris.aep.selfProfile.service.AepSelfProfileServiceImpl.insertDataIntoAelfProfileServiceImpl.java:214) в com.tcs.tool.iris.aep.selfProfile.controller.UpdateProgressController.onSubmit (UpdateProgressController.java:48) в org.springframework.web.servlet.mvc.Sormle272) в org.springframework.web.servlet.mvc.AbstractFormController.handleInvalidSubmit (AbstractFormController.java:675) в org.springframework.web.servlet.mvc.AbstractFormController.handleRequestInternal (абстрактный) forweb: orgForm.servlet.mvc.AbstractController.handleRequest (AbstractController.java:153) в org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle (SimpleControllerHandlerAdapter.java:48) в org.springfererv..java: 790) по адресу org.springframework.web.servlet.DispatcherServlet.doService (DispatcherServlet.java:719) по адресу org.springframework.web.servlet.FrameworkServlet.processRequest (FrameworkServlet.java:64in at или org)gframework.web.servlet.FrameworkServlet.doPost (FrameworkServlet.java:560) по адресу javax.servlet.http.HttpServlet.service (HttpServlet.java:637) по адресу javax.servlet.http.HttpServletpserviceв org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:290) в org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:206) в org.apc.(StandardWrapperValve.java:233) в org.apache.catalina.core.StandardContextValve.invoke (StandardContextValve.java:191) в org.apache.catalina.core.StandardHostValve.invoke (StandardHostValve.gava: org.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java:102) в org.apache.catalina.core.StandardEngineValve.invoke (StandardEngineValve.java:109) в org.apache.catalina.connector.Cooteterjj.298) на org.apache.coyote.http11.Http11Processor.process (Http11Processor.java:857) на org.apache.coyote.http11.Http11Protocol $ Http11ConnectionHandler.process (Http11Protocol.java:588) в org.apache.tomcat.util.net.JIoEndpoint $ Worker.run (JIoEndpoint.java:489) в java.lang.Thread.run (неизвестный источник)

Пожалуйста, помогите мне выяснить, что не так с этим.И как преобразовать его в правильный формат.

Фрагмент кода, где я получаю исключение, выглядит следующим образом: -

SimpleDateFormat sdf = new SimpleDateFormat(
                                "dd-MMM-yyyy HH:mm:ss");
                        Calendar currenttime = Calendar.getInstance();
                        java.util.Date currentdate = currenttime.getTime();
                        String currentDateInsert = sdf.format(currentdate);
                        CommentNActionItem commentAndAction = commentActionItem
                                .get(i);
                        java.util.Date datefromDb = null;
                        try {
                            @SuppressWarnings("unused")
                            Date dateF=sdf.parse(commentAndAction.getCreatedDate());
                            datefromDb = (java.sql.Date)sdf.parseObject(commentAndAction.getCreatedDate());
                        } catch (Exception e1) {
                            // TODO Auto-generated catch block
                            e1.printStackTrace();

}

Ответы [ 8 ]

17 голосов
/ 04 марта 2012

Процесс преобразования строк даты довольно прост.Вы определяете входной формат, используете его для анализа исходной строки, затем определяете выходной формат и используете его для преобразования его обратно в строку.

У меня сложилось впечатление, что вы пытаетесь это сповторно использовать тот же формат для анализа и вывода? Используйте два формата , затем!

// Convert input string into a date
DateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");
Date date = inputFormat.parse(inputString);

// Format date into output format
DateFormat outputFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
String outputString = outputFormat.format(date);
3 голосов
/ 04 марта 2012

Год на первом месте и вам нужно разобрать миллисекундную часть.Я расширил ответ, чтобы показать простое преобразование формата даты:

    SimpleDateFormat in = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
    SimpleDateFormat out = new SimpleDateFormat("dd-MM-yy HH:mm:ss");

    Date date = in.parse("2012-03-04 11:09:00.123");
    String result = out.format(date);
    System.out.println(result);
1 голос
/ 06 декабря 2017

ТЛ; др

LocalDateTime.parse( 
    "2012-03-04 00:00:00.0".replace( " " , "T" ) 
).format(
    DateTimeFormatter.ofPattern( "uuuu-MM-dd HH:mm:ss" )
)

java.time

В других Ответах используются старые классы даты и времени, которые в настоящее время являются устаревшими и полностью заменены современными классами java.time. Для более ранней версии Android см. Последние пункты ниже.

Анализировать как LocalDateTime объект, так как на вашем входе отсутствует указание часового пояса или смещения от UTC.

String input = "2012-03-04 00:00:00.0".replace( " " , "T" ) ; 

LocalDateTime ldt = LocalDateTime.parse( input ) ;

Если вы действительно не заботитесь о доле секунды, отрубите ее.

LocalDateTime ldtTruncated = ldt.truncatedTo( ChronoUnit.SECONDS ) ;

Укажите свой пользовательский формат для использования при генерации строки для представления этого значения.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd HH:mm:ss" ) ;
String output = ldtTruncated.format( f ) ;

Дамп на консоль.

System.out.println( "input: " + input ) ;
System.out.println( "ldt: " + ldt ) ;
System.out.println( "ldtTruncated: " + ldtTruncated ) ;
System.out.println( "output: " + output ) ;

См. код, запущенный в режиме реального времени на IdeOne.com .

ввод: 2012-03-04T00: 00: 00.0

ldt: 2012-03-04T00: 00

ldtTruncated: 2012-03-04T00: 00

вывод: 2012-03-04 00: 00: 00


О java.time

Инфраструктура java.time встроена в Java 8 и более поздние версии. Эти классы заменяют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на java.time классы.

Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .

Где взять классы java.time?

0 голосов
/ 05 декабря 2017

Формат даты с названием дня недели в Java Android

Input: 2017-08-02T12:54:54+04:00 
you are required to show results like:
Output:    Wednesday
           August 2, 2017 12:54 pm



 public static String getDateFormat(String date){
      String input_date= date;
     //incase you are getting format 2017-08-02T12:54:54+04:00 you need to
    // replace T with " " doing so String input_date = date.replace("T","");
      SimpleDateFormat format1=new SimpleDateFormat("yyyy-MM-dd HH:mm");
      Date dt1= null;
      try {
        dt1 = format1.parse(input_date);
      } catch (ParseException e) {
        e.printStackTrace();
      }

      DateFormat format2=new SimpleDateFormat("EEEE");
      String finalDay=format2.format(dt1);
      String stringDate = DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.SHORT).format(dt1); // for seconds removal use DateFormat.SHORT in second parameter  
      return finalDay+"\n"+stringDate;
      }
0 голосов
/ 11 октября 2013

Вы можете использовать этот класс:

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.text.ParseException;
/**
 * Helper class for handling ISO 8601 strings of the following format:
 * "2008-03-01T13:00:00+01:00". It also supports parsing the "Z" timezone.
 */
public final class ISO8601 {
    /** Transform Calendar to ISO 8601 string. */
    public static String fromCalendar(final Calendar calendar) {
        Date date = calendar.getTime();
        String formatted = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").format(date);
        return formatted.substring(0, 22) + ":" + formatted.substring(22);
    }

    /** Get current date and time formatted as ISO 8601 string. */
    public static String now() {
        return fromCalendar(GregorianCalendar.getInstance());
    }

    /** Transform ISO 8601 string to Calendar. */
    public static GregorianCalendar toCalendar(final String iso8601string) throws ParseException {
        GregorianCalendar calendar = (GregorianCalendar) GregorianCalendar.getInstance();
        String s = iso8601string;
        Date date = null;
        try{
            s=s.replace("Z", "+00:00");
            try {
                s = s.substring(0, 26) + s.substring(27);
            } catch (IndexOutOfBoundsException e) {}
            date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ").parse(s);
        }catch(Exception tc)
        {
            s=s.replace("Z", "+00:00");
            try {
                s = s.substring(0, 22) + s.substring(23);
            } catch (IndexOutOfBoundsException e) {}
            date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").parse(s);
        }
        calendar.setTime(date);
        return calendar;
    }
}
0 голосов
/ 04 марта 2012

Я думаю, что это код, который вы ищете:

    String dateString = "2012-03-04 00:00:00.0";
    DateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.S");
    DateFormat outputFormat = new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss");
    Date date = inputFormat.parse(dateString);
    System.out.println(outputFormat.format(date));
0 голосов
/ 04 марта 2012

проверьте этот код .. Вы можете преобразовать строковый формат в формат даты, используя SimpleDateFormat

public static final String DATE_TIME_FORMAT = "yyyy-MM-dd hh:mm aa ";
SimpleDateFormat dateTimeFormat = new SimpleDateFormat(DATE_TIME_FORMAT);
Date date = null;
try {

      String date_time_string="2012-03-01 21:15 am";

                date = dateTimeFormat.parse(date_time_string);
            } catch (java.text.ParseException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
0 голосов
/ 04 марта 2012

Попробуйте использовать правильный формат (порядок, М для месяца) и добавьте шаблон для миллисекунд:

new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...