-1

これら2つのクラスから値を取得Dateして解析して単一のJavaタイムスタンプにしようとしてDatePickerいますが、logcatはこれをスローしますTimeTimePickerDateTimeFormatterexception

 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1075)
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Method.invoke(Native Method)
        at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:409)
        at android.view.View.performClick(View.java:7870) 
        at android.widget.TextView.performClick(TextView.java:14970) 
        at android.view.View.performClickInternal(View.java:7839) 
        at android.view.View.access$3600(View.java:886) 
        at android.view.View$PerformClick.run(View.java:29363) 
        at android.os.Handler.handleCallback(Handler.java:883) 
        at android.os.Handler.dispatchMessage(Handler.java:100) 
        at android.os.Looper.loop(Looper.java:237) 
        at android.app.ActivityThread.main(ActivityThread.java:7948) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1075) 
     Caused by: java.time.format.DateTimeParseException: Text '2 11, 11 2021 21:35' could not be parsed at index 0
        at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)
        at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1777)
        at com.example.medicalnotifier.MainActivity.check(MainActivity.java:238)
        at com.example.medicalnotifier.MainActivity.onClick(MainActivity.java:341)

そして、日付をフォーマットしようとしているコードはこれです

         dpicker=datView.findViewById(R.id.user_date);
         year=dpicker.getYear();
         month=dpicker.getMonth();
         day=dpicker.getDayOfMonth();
         int hour=timepicker.getCurrentHour();
         int min=timepicker.getCurrentMinute();
         String pattern = "MMM dd, yyyy HH:mm";
         String timestamp= (String.valueOf(month)+" "+String.valueOf(day)+", "+String.valueOf(day)
                 +" "+String.valueOf(year)+" "+String.valueOf(hour)+":"+String.valueOf(min));
         DateTimeFormatter formatter=DateTimeFormatter.ofPattern(pattern, Locale.ENGLISH);
         LocalDateTime localDateTime = LocalDateTime.from(formatter.parse(timestamp));
         mytimestamp=Timestamp.valueOf(localDateTime.toString());
4

1 に答える 1

1
  1. day2回使用:
String timestamp= (String.valueOf(month)+" "+
                   String.valueOf(day)+", "+   
                   // String.valueOf(day)+" "+    // REPEATED, delete!
                   String.valueOf(year)+" "+
                   String.valueOf(hour)+":"+
                   String.valueOf(min));

  1. 解析に 1 文字を使用する
String pattern = "M d, y H:m";

また、3 文字はテキスト ルールを意味することに注意してください (3 文字未満の数字ルールとは対照的に)。


  1. を使用しLocalDateTime.of(year, month, day, hour, minute)、前の 2 つの点を無視します。
int year = ...  // actual code
int month =     // "
int day = ...   // "
int hour = ...  // "
int min = ...   // " 
LocalDateTime localDateTime = LocalDateTime.of(year, month, day, hour, min);

3 a) 日付ピッカーが 1 年の月を 0 から 11 まで数えている場合 (一部の日付ピッカーが持っているひどい習慣です)、月のLocalDateTime番号に 1 から 12 が割り当てられることを正常に期待しているため、月の番号に 1 を追加する必要があります。


  1. 取得するために文字列に変換しないでくださいTimestamp(仮定java.sql.Timestamp):
mytimestamp = Timestamp.valueOf(localDateTime);  // no toString here
于 2021-03-11T19:04:16.233 に答える