文字列を人間が読める形式に変換できません -- java フィールド と date フィールド と simpledateformat フィールド と date-format フィールド と parseexception フィールド 関連 問題

Unable to convert string to human-readable format












1
vote

問題

日本語

ここでのコードの何が問題なのですか?私はあなたが欲しいフォーマットで文字列を返すことができません...

メソッド呼び出し:

<事前> <コード> incident.setTargetDate(DateUtil.formatResolutionTime(targetDateList.get(i)));

フォーマッタ:

<事前> <コード> public class DateUtil { public static String formatResolutionTime(String startDateString) { DateFormat df = new SimpleDateFormat("MM/dd/yyyy"); Date startDate = null; try { startDate = df.parse(startDateString); } catch (ParseException e) { e.printStackTrace(); } String newDateString = df.format(startDate); System.out.println(newDateString); return newDateString; } }

例外:

<事前> <コード> java.text.ParseException: Unparseable date: "2017-05-26T00:00:00+02:00" at java.text.DateFormat.parse(DateFormat.java:366) at app.util.DateUtil.formatResolutionTime(DateUtil.java:19) at app.controller.TableViewController.retrieveTicketsForTable(TableViewController.java:194) at app.controller.TableViewController.initialize(TableViewController.java:139) at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548) at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441) at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3214) at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175) at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148) at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124) at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104) at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097) at app.Main.start(Main.java:14) at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863) at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326) at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295) at java.security.AccessController.doPrivileged(Native Method) at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294) at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95) at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191) at java.lang.Thread.run(Thread.java:745)
英語

What is wrong with my code here? I'm unable return a String in the format I'd like...

Method Call:

incident.setTargetDate(DateUtil.formatResolutionTime(targetDateList.get(i))); 

Formatter:

public class DateUtil {      public static String formatResolutionTime(String startDateString) {         DateFormat df = new SimpleDateFormat("MM/dd/yyyy");         Date startDate = null;          try {             startDate = df.parse(startDateString);         } catch (ParseException e) {             e.printStackTrace();         }         String newDateString = df.format(startDate);         System.out.println(newDateString);         return newDateString;         }         } 

Exception:

java.text.ParseException: Unparseable date: "2017-05-26T00:00:00+02:00"     at java.text.DateFormat.parse(DateFormat.java:366)     at app.util.DateUtil.formatResolutionTime(DateUtil.java:19)     at app.controller.TableViewController.retrieveTicketsForTable(TableViewController.java:194)     at app.controller.TableViewController.initialize(TableViewController.java:139)     at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548)     at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)     at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3214)     at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)     at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)     at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)     at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)     at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)     at app.Main.start(Main.java:14)     at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863)     at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326)     at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)     at java.security.AccessController.doPrivileged(Native Method)     at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)     at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)     at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)     at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)     at java.lang.Thread.run(Thread.java:745) 
</div
              
 
 

回答リスト

3
 
vote
vote
ベストアンサー
 

2つのフォーマットが必要です。入力フォーマットを解析するためのものと出力を作成するためのもの。

<事前> <コード> public static String formatResolutionTime(String startDateString) { DateFormat dfParse = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZZZZ"); //Format for parsing the Input string DateFormat df = new SimpleDateFormat("MM/dd/yyyy"); //Format for formatting the output Date startDate = null; try { startDate = dfParse.parse(startDateString); } catch (ParseException e) { e.printStackTrace(); } String newDateString = df.format(startDate); System.out.println(newDateString); return newDateString; }
 

You need two formats. One for parsing the input format and one for formating the Output.

public static String formatResolutionTime(String startDateString) {     DateFormat dfParse = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZZZZ"); //Format for parsing the Input string     DateFormat df = new SimpleDateFormat("MM/dd/yyyy"); //Format for formatting the output     Date startDate = null;      try {         startDate = dfParse.parse(startDateString);     } catch (ParseException e) {         e.printStackTrace();     }     String newDateString = df.format(startDate);     System.out.println(newDateString);     return newDateString;  } 
</div
 
 
     
     
3
 
vote

"yyyy-MM-dd'T'hh:mm:ssXXX" の文字列を解析しようとしているが、文字列がtype の形式であることを伝えるため、例外 Unparseable date: "2017-05-26T00:00:00+02:00" を取得しています。 MM/dd/yyyy. 入力文字列は "2017-05-26T00:00:00+02:00" の形式のもので、他の投稿で提案されているように、 MM/dd/yyyy の形式の出力が必要な場合は、2つのフォーマッタが必要です。

<事前> <コード> public static String formatResolutionTime(String startDateString) { DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ssXXX"); Date startDate = null; try { startDate = df.parse(startDateString); } catch (ParseException e) { e.printStackTrace(); } DateFormat newFormatter = new SimpleDateFormat("MM/dd/yyyy"); String newDateString = newFormatter.format(startDate); System.out.println(newDateString); return newDateString; }
 

You are getting the exception Unparseable date: "2017-05-26T00:00:00+02:00", because you are trying to parse a String of the format "yyyy-MM-dd'T'hh:mm:ssXXX" , but telling the formatter that your string is of type MM/dd/yyyy. Your input String is of the format "2017-05-26T00:00:00+02:00" and you want the output in the format MM/dd/yyyy, so as suggested in other posts, you need two formatters.

public static String formatResolutionTime(String startDateString) {          DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ssXXX");         Date startDate = null;          try {             startDate = df.parse(startDateString);         } catch (ParseException e) {             e.printStackTrace();         }         DateFormat newFormatter = new SimpleDateFormat("MM/dd/yyyy");         String newDateString = newFormatter.format(startDate);         System.out.println(newDateString);         return newDateString;      } 
</div
 
 
2
 
vote

MM / DD / YYYY形式の日付をチェックしていますが、フォーマットYYYY-MM-DDの日付を提供します。

 

You're checking for a date in the format MM/DD/YYYY but provides a date with format YYYY-MM-DD.

</div
 
 
     
     
2
 
vote

2つのDateFormatオブジェクトを使用する必要があります.1つは解析用(入力 - &gt;日付)とフォーマット用のもの(日付 - &GT;出力)。

あなたの入力は 2017-05-26T00:00:00+02:00 です。それを分解しましょう( SimpleDateFormat ):

  • <コード> 2017 :<コード> yyyy
  • の形式の年
  • 05 "yyyy-MM-dd'T'hh:mm:ssXXX"0
  • の形式の月
  • <コード> "yyyy-MM-dd'T'hh:mm:ssXXX"1 : "yyyy-MM-dd'T'hh:mm:ssXXX"2
  • の形式の日
  • "yyyy-MM-dd'T'hh:mm:ssXXX"3 :文字<コード> 998876614
  • の形式の日付と時刻の間の区切り文字
  • "yyyy-MM-dd'T'hh:mm:ssXXX"5 "yyyy-MM-dd'T'hh:mm:ssXXX"6 ではなく <コード> "yyyy-MM-dd'T'hh:mm:ssXXX"7 )
  • "yyyy-MM-dd'T'hh:mm:ssXXX"8 "yyyy-MM-dd'T'hh:mm:ssXXX"9
  • の形式の議事録
  • MM/dd/yyyy.0 MM/dd/yyyy.1
  • の形式の秒数:
  • MM/dd/yyyy.2 MM/dd/yyyy.3
  • の形式のタイムゾーン

だからあなたのSimpleDateFormatパーサーパターンは

になります <事前> <コード> MM/dd/yyyy.4

追加の注意

あなたのコードが予期しない動作をもたらす可能性があるため、実際には MM/dd/yyyy.5 がNULLになり、FormatterはNULL日付をフォーマットして結果を返してみたいます。 <コード> MM/dd/yyyy.6 の生成

言った、私のコードは次のとおりです。

<事前> <コード> MM/dd/yyyy.7

 

You have to use two DateFormat objects: one for parsing (input -> date) and one for formatting (date -> output).

Your input is 2017-05-26T00:00:00+02:00. Let's break it down (refer SimpleDateFormat):

  • 2017: the year in the format yyyy
  • 05: the month in the format MM
  • 26: the day in the format dd
  • T: separator between date and time in the format of character 'T'
  • 00: the hour in the format HH (not hh)
  • 00: the minutes in the format mm
  • 00: the seconds in the format ss
  • +02:00: the time zone in the format XXX

So your SimpleDateFormat parser pattern will be

yyyy-MM-dd'T'HH:mm:ss:XXX 

Additional notes

In case of ParseException your code could result in unexpected behaviour, in fact after the try/catch block your startDate will be null and the formatter will try to format the null date and return the result, generating a NullPointerException.

Said that, my code would be:

private static final String PARSE_PATTERN = "yyyy-MM-dd'T'HH:mm:ssXXX"; private static final String FORMAT_PATTERN = "MM/dd/yyyy"; // we cannot declare the SimpleDateFormat as static since it isn't thread-safe  public static String formatResolutionTime(String startDateString) {      try {         DateFormat parser = new SimpleDateFormat(PARSE_PATTERN);         Date startDate = parser.parse(startDateString);          DateFormat formatter = new SimpleDateFormat(FORMAT_PATTERN);         return formatter.format(startDate);     } catch (ParseException e) {         // e.printStackTrace();         return "Error"; // or whatever, but return a string here     } } 
</div
 
 
1
 
vote

この答えのスレッドは現代の答えなしに完全ではないでしょう。

<事前> <コード> MM/dd/yyyy.8

結果は

です <事前> <コード> MM/dd/yyyy.9

今まで読んだ答えは正しいです - そして古くなっています。 2017年に古いクラスをスキップする時が来ました 998876630 と<コード>および<コード> 998876631 を使用し、新しいJava日時API 、この場合、 998876632 および "2017-05-26T00:00:00+02:00"3 。元の日時文字列はISO 8601に準拠しているため、これはさらに適しています。これは、新しいクラスがデフォルトとして「理解している」という形式です。だから私たちは解析のための明示的な形式を与える必要はありません( "2017-05-26T00:00:00+02:00"4 に必要なように)。

 

This thread of answers would not be complete without the modern answer.

    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MM/dd/yyyy");     String newDateString = OffsetDateTime.parse(startDateString).format(dtf); 

The result is

05/26/2017 

The answers I have read until now are correct — and outdated. In 2017 it’s time to skip the old classes SimpleDateFormat and Date, and use the newer Java date and time API, in this case DateTimeFormatter and OffsetDateTime. This is even more appropriate as your original date-time string conforms with ISO 8601, the format that the newer classes "understand" as their default. So we need not give an explicit format for parsing (as would be needed with SimpleDateFormat).

</div
 
 
0
 
vote
<事前> <コード> "2017-05-26T00:00:00+02:00"5

私のために動作します)

 
    DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");     Date date = new Date();     //System.out.println(dateFormat.format(date));     return dateFormat.format(date); 

It works for me)

</div
 
 

関連する質問

5  UTCの日付文字列を変換して、JとZをJavaで削除する方法  ( How to convert utc date string and remove the t and z in java ) 
Java 1.7を使用しています。 変換しようとしています: <事前> <コード> 2018-05-23T23:18:31.000Z にに <事前> <コード> 2018-05-23 23:18:31 Deaitutilsクラス: <事前> <...

8  SimpleDateFormatの「解析可能な日付」例外  ( Simpledateformat unparseable date exception ) 
SimpleDateFormat.parse() でDateTime Stringを解析しようとしていますが、未消跡の日時以外の点外を受信し続けます。 これは私が解析しようとしている日付形式です。 2011-10-06T12:00:00-08:00 こ...

3  エラーを取らずに文字列をBigDecimalに解析する方法  ( How to parse string to bigdecimal without getting error ) 
文字列配列からBigDecimalに値を解析したい場合、このエラーがあります。 <事前> <コード> Exception in thread "main" java.text.ParseException: Unparseable number: "86400...

0  コンストラクターの日付を宣言する[重複]  ( Declare date on constructor ) 
この質問はすでにここで回答を持っています チェック対象vs java の未チェックの例外 (21回答) p...

0  クエリが長すぎるとLucene ParseException  ( Lucene parseexception when the query is too long ) 
org.apache.lucene.queryparser.queryParser.parse(string arg0)string arg0が長すぎるとparseExceptionをスローします。この問題を回避する方法についての考えはありますか? ...

3  java parseExceptionは、文字列をDate to Dateにしようとしました  ( Java parseexception while attempting string to date parsing ) 
Webサービスから返送された日付文字列を解析/フォーマットするのに苦労しています。私は複数のアプローチを試みました、しかし運されずに。 サンプル日付文字列: <事前> <コード> 2011-10-05T03:00:00Z 例外: <事前> <コー...

0  Java [Duplicate]の日付に文字列を変換する際のエラー  ( Error in converting string to date in java ) 
この質問はすでにここで回答を持っています デフォルトのコンストラクタの構築中は、例外を処理できません:型例外暗黙のスーパーコンストラクタによってスローされた (4回答) ...

13  DecimalFormatは数字を数字で変換します  ( Decimalformat converts numbers with non digits ) 
この種の数字を使用する場合は、DecimalFormatの使用は解析されません。 123hello これは明らかに実際には数字ではなく、123.0の値に変換されます。この種の行動を回避するにはどうすればいいですか? サイドノートとしてhello123は例外...

1  Android - SAXParserエラー:ParSeException:1行目、列0:整形式(無効なトークン)  ( Android saxparser error parseexception at line 1 column 0 not well formed ) 
XMLを解析しようとすると、次の例外があります。 <事前> <コード> org.apache.harmony.xml.ExpatParser$ParseException: At line 1, column 0: not well-formed (inva...

0  StringからDateオブジェクトへの日付を解析中のParSeException  ( Parseexception while parsing date from string to date object ) 
String から Date オブジェクトへの日付を解析しながら、 ParseException を取得しています。日付文字列にはTimeZoneも含まれています。私はこのコードを使っています: <事前> <コード> final SimpleDateFor...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有