2012-03-04 29 views
6

Tôi có định dạng ngày mà tôi nhận được từ cơ sở dữ liệu và một loại Chuỗi. Nó có giá trị được lưu trữ giống như "2012-03-04 00: 00: 00.0" nhưng tôi đã khai báo SimpleDateFormat là "dd-MMM-yyyy HH: mm: ss" cần thiết trong dự án của tôi. Bây giờ bất cứ khi nào tôi lấy một số dữ liệu alsong với ngày từ cơ sở dữ liệu tôi nhận được một ngoại lệ phân tích cú pháp với nhật ký như dưới đây.Cách chuyển đổi "2012-03-04 00: 00: 00.0" thành Ngày có định dạng "dd-mm-yyyy HH: mm: ss" Sử dụng Java

java.text.ParseException: Unparseable date: "2012-03-04 00:00:00.0" 
    at java.text.DateFormat.parse(Unknown Source) 
    at com.tcs.tool.iris.aep.selfProfile.dao.AepSelfProfileDaoImpl$1.setValues(AepSelfProfileDaoImpl.java:1188) 
    at org.springframework.jdbc.core.JdbcTemplate$4.doInPreparedStatement(JdbcTemplate.java:892) 
    at org.springframework.jdbc.core.JdbcTemplate$4.doInPreparedStatement(JdbcTemplate.java:1) 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:586) 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:614) 
    at org.springframework.jdbc.core.JdbcTemplate.batchUpdate(JdbcTemplate.java:883) 
    at com.tcs.tool.iris.aep.selfProfile.dao.AepSelfProfileDaoImpl.insertDataIntoActionItems(AepSelfProfileDaoImpl.java:1174) 
    at com.tcs.tool.iris.aep.selfProfile.service.AepSelfProfileServiceImpl.insertDataIntoActionItems(AepSelfProfileServiceImpl.java:214) 
    at com.tcs.tool.iris.aep.selfProfile.controller.UpdateProgressController.onSubmit(UpdateProgressController.java:48) 
    at org.springframework.web.servlet.mvc.SimpleFormController.processFormSubmission(SimpleFormController.java:272) 
    at org.springframework.web.servlet.mvc.AbstractFormController.handleInvalidSubmit(AbstractFormController.java:675) 
    at org.springframework.web.servlet.mvc.AbstractFormController.handleRequestInternal(AbstractFormController.java:275) 
    at org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:153) 
    at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644) 
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
    at java.lang.Thread.run(Unknown Source) 

Hãy giúp tôi tìm ra điều gì sai với điều này. Và cách chuyển đổi nó thành định dạng đúng.

Đoạn mã mà tôi có được ngoại lệ như sau: -

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

}

+1

Bạn đã sử dụng định dạng nào để * phân tích cú pháp *? –

+1

Vui lòng cung cấp cho chúng tôi nhiều * * nhiều ngữ cảnh (và mã). Tại sao bạn phân tích cú pháp văn bản chút nào khi tìm nạp giá trị từ cơ sở dữ liệu? Tại sao bạn không nhận được giá trị * như một ngày *? Kiểu dữ liệu trong cơ sở dữ liệu là gì? –

+0

@ Anony-Mousse Tôi đã cập nhật đoạn mã. Và tôi chỉ cần định dạng HH: mm: ss yyyy-MM-dd. Dữ liệu có thể tạo thành DB có định dạng HHymmy-MM-dd HH: mm: ss.S được chuyển đổi không? –

Trả lời

16

Quá trình chuyển đổi chuỗi ngày là khá đơn giản. Bạn xác định định dạng đầu vào, sử dụng nó để phân tích chuỗi gốc, sau đó xác định định dạng đầu ra và sử dụng định dạng đó để chuyển đổi nó thành chuỗi.

Tôi có ấn tượng rằng bạn đang cố gắng tắt lối này, bằng cách sử dụng lại cùng một định dạng để phân tích cú pháp và xuất? Sử dụng hai định dạng, sau đó!

// 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); 
+0

Bạn có thể vui lòng cung cấp một ví dụ để giải thích cho tôi? Sẽ rất hữu ích! –

+1

Được cập nhật với ví dụ tiết hơn. Nhưng bạn nên tự mình thử! –

+0

Cảm ơn rất nhiều Anony !! :) Nó hoạt động .. –

0

Cố gắng sử dụng định dạng phù hợp (theo thứ tự, M trong tháng) và thêm mô hình cho mili giây:

new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S"); 
+0

Tôi đã cập nhật đoạn mã. Và tôi chỉ cần định dạng HH: mm: ss yyyy-MM-dd. Dữ liệu có thể tạo thành DB có định dạng HHymmy-MM-dd HH: mm: ss.S được chuyển đổi không? –

+0

Bạn có thể cắt chuỗi thành một phần trước dấu chấm hoặc phân tích cú pháp nó bằng mẫu ở trên và chỉ bỏ qua mili giây. – Koraktor

+0

Nghe hay đấy. Hãy để tôi thử. –

2

Năm là nơi đầu tiên và bạn cần phải phân tích một phần nghìn giây. Tôi đã kéo dài câu trả lời cho thấy một sự chuyển đổi đơn giản DateFormat:

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

Tôi có thể chuyển đổi định dạng thành dd-MM-yyyy HH: mm: ss không? như trong một chuỗi trong yyyy-MM-dd HH: mm: ss.SSS định dạng nó có thể được chuyển đổi ở trên không? –

0

kiểm tra mã này .. Bạn có thể chuyển đổi định dạng chuỗi sang định dạng ngày sử dụng 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

Tôi nghĩ rằng đây là mã bạn đang tìm kiếm:

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

Bạn có thể sử dụng lớp này:

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

Định dạng ngày với tên ngày trong tuần trong 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

FYI, các lớp ngày giờ phiền hà cũ như 'java.util.Date',' java.util.Calendar' và 'java.text.SimpleDateFormat' hiện là thừa kế, được thay thế bởi [java.time] (https : //docs.oracle.com/javase/9/docs/api/java/time/package-summary.html) các lớp học. Phần lớn chức năng java.time được chuyển sang Java 6 & Java 7 trong dự án [ThreeTen-Backport] (http://www.threeten.org/threetenbp/). Điều chỉnh thêm cho các phiên bản Android cũ hơn trong dự án [ThreeTenABP] (https://github.com/JakeWharton/ThreeTenABP). Xem [* Cách sử dụng ThreeTenABP… *] (http://stackoverflow.com/q/38922754/642706). –

1

tl; dr

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

java.time

Các câu trả lời khác sử dụng các lớp học ngày thời gian cũ phiền hà mà bây giờ di sản, được thay thế hoàn toàn bởi các lớp java.time hiện đại. Đối với Android trước đó, hãy xem các dấu đầu dòng cuối cùng bên dưới.

Phân tích cú pháp làm đối tượng LocalDateTime vì đầu vào của bạn thiếu bất kỳ dấu hiệu nào về múi giờ hoặc offset-from-UTC.

Nếu bạn thực sự không quan tâm đến phân đoạn thứ hai, hãy cắt bỏ phần thứ hai.

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

Chỉ định định dạng tùy chỉnh của bạn để sử dụng trong việc tạo Chuỗi để thể hiện giá trị này.

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

Dump to console.

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

Xem này code run live at IdeOne.com.

đầu vào: 2012-03-04T00: 00: 00.0

ldt: 2012-03-04T00: 00

ldtTruncated: 2012-03-04T00: 00

đầu ra: 2012 -03-04 00:00:00


Về java.time

Khuôn khổ java.time được tích hợp vào Java 8 trở lên. Các lớp này thay thế các lớp học ngày giờ legacy phiền hà cũ như java.util.Date, Calendar, & SimpleDateFormat.

Dự án Joda-Time, hiện đang ở maintenance mode, khuyên di chuyển đến các lớp java.time.

Để tìm hiểu thêm, hãy xem Oracle Tutorial. Và tìm kiếm Stack Overflow cho nhiều ví dụ và giải thích. Đặc điểm kỹ thuật là JSR 310.

Nơi lấy các lớp java.time?

Các vấn đề liên quan