2016-10-19 3 views
0

私の日付の文字列は: "Wed Oct 19 14:34:26 BRST 2016"で、 "dd/MM/yyyy 」しかし、私は次の例外取得しています:メソッドフォーマット解析例外 "EEE MMM dd HH:mm:ss Z yyyy"

public String dataText(int lastintervalo) { 

     Date mDate = new Date(); 
     String dt = mDate.toString(); 
     SimpleDateFormat sdf = new SimpleDateFormat("EE MMM dd HH:mm:ss z yyyy", 
       Locale.getDefault()); 
     Calendar c = Calendar.getInstance(); 
     try { 
      c.setTime(sdf.parse(dt)); 

     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 
     sdf.applyPattern("dd/MM/yyyy"); 

     c.add(Calendar.DATE, lastintervalo); 
     return sdf.format(c.getTime()); 

    } 

java.text.ParseException: Unparseable date: "Wed Oct 19 14:34:26 BRST 2016" (at offset 20) 

を私はすでにグーグルとstackoverflowの質問で検索、何も

+0

私はこのコードを試しました、それは動作します、私は例外と私のロケール 'en_IN'を得ませんでした – Saravana

+0

あなたは' Locale'ですか? – Saravana

+0

@Saravana Brazil – AND4011002849

答えて

2

BRST値である20を、オフセット働くこと、タイムゾーンを解決できないようです。

ブラジルのタイムゾーンが認識されていることを確認する必要があること、このコードを試してください:私は米国東部にいるので、

SimpleDateFormat sdf = new SimpleDateFormat("EE MMM dd HH:mm:ss z yyyy", Locale.US); 
sdf.setTimeZone(TimeZone.getTimeZone("America/Sao_Paulo")); 
System.out.println(sdf.parse("Wed Oct 19 14:34:26 BRST 2016")); 

私のためにこれを印刷している:

Wed Oct 19 12:34:26 EDT 2016 
0

はこれを試してみてください動作していないようにみえます。 。それ エラーメッセージが文句を言っているので

SimpleDateFormat sdf = new SimpleDateFormat("EE MMM dd HH:mm:ss z yyyy", 
        Locale.ENGLISH); 
1

TL。 DR

ZonedDateTime.parse ( 
    "Wed Oct 19 14:34:26 BRST 2016" , 
    DateTimeFormatter.ofPattern ("EE MMM dd HH:mm:ss z uuuu") 
) 
.toLocalDate() 
.format( 
    DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT) 
        .withLocale(Locale.UK) 
) 

19/10/16

あなたはjava.timeクラスに取って代わら面倒な古い日付時刻クラス、今の遺産を、使用している

java.time

使用リアルタイムゾーン

彼らは真の時間帯ではないとして標準化された、などBRSTまたはESTまたはISTなど3-4文字の省略形ではなく、使用しないでください、とさえ一意ではありません(!)。

continent/regionの形式でproper time zone nameを指定します。たとえば、America/Sao_Pauloです。

このような場合、以下のコードは動作しますが、私はではありません。は入力などのデータの交換をお勧めしていません。データソースへの影響がある場合は、標準ISO 8601形式を使用して日付/時刻値のデータ交換に変更します。

2016-10-19T14:34:26から02:00

さらに良い

、交換列ZonedDateTimeによって作成され、角括弧内の時間帯名を付加することによりISO 8601フォーマットを拡張します。

2016-10-19T14:34:26から02:00 [アメリカ/ Sao_Paulo]

すべてのベスト、通常、データを交換する前に、UTCへのそのような値を変換することです。 java.timeでは、toInstant().toString()を呼び出してこれを行います。通常、UTCで作業するのが最善で、ユーザーにプレゼンテーションなどの必要な場合にのみタイムゾーンを適用します。

2016-10-19T16:34:26Z

例コード

String input = "Wed Oct 19 14:34:26 BRST 2016"; 
DateTimeFormatter f = DateTimeFormatter.ofPattern ("EE MMM dd HH:mm:ss z uuuu"); 
ZonedDateTime zdt = ZonedDateTime.parse (input , f); 

zdt.toString():2016-10-19T14:34:26から02: 00 [America/Sao_Paulo]

同じ時刻をUTCで表示するには、Instantを抽出します。

Instant instant = zdt.toInstant(); 

instant.toString():2016-10-19T16:34:26Z

LocalDateクラスは、時間日の時間帯無し無し日付のみの値を表します。

LocalDate ld = zdt.toLocalDate(); 

ld.toString():2016年10月19日

DateTimeFormatterクラスのスタックオーバーフローを検索し、他の形式の文字列を生成します。一般的に、java.timeを自動的にローカライズするには最適です。

  • FormatStyle文字列がどのくらいか、省略をする必要があります決定するために:、ローカライズ指定するには

  • Locale(a)日の名前、月の名前などを翻訳するための人間言語、および(b)略語、大文字、句読点などの問題を決定する文化的な基準を決定する。

例:

Locale l = Locale.CANADA_FRENCH ; // Or Locale.US or Locale.ITALY etc. 
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT).withLocale(l); 
String output = ld.format(f); 

java.timeについて

java.timeフレームワークは、Java 8に組み込まれており、後にされています。これらのクラスは、java.util.Date,.Calendar,& java.text.SimpleDateFormatなどの面倒な古いlegacy日時クラスに取って代わります。

にあるJoda-Timeプロジェクトは、java.timeへの移行を推奨しています。

詳しくはOracle Tutorialをご覧ください。そして、多くの例と説明のためにStack Overflowを検索してください。仕様はJSR 310です。

ここで、java.timeクラスを取得するには?

  • Java SE 8SE 9以降
    • 内蔵しています。
    • バンドルされた実装の標準Java APIの一部です。
    • Java 9には、いくつかのマイナーな機能と修正が加えられています。
  • Java SE 6SE 7
    • java.time機能の多くはThreeTen-BackportのJava 6 & 7に戻って、移植されます。
  • Android
    • ThreeTenABPプロジェクトはThreeTen-バックポート具体的にAndroidのため(上記)を適応させます。
    • How to use…を参照してください。

ThreeTen-Extraプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、将来のjava.timeへの追加の可能性を証明する土台です。ここでは、IntervalYearWeekYearQuartermoreなどの便利なクラスがあります。

関連する問題