文字列のDateFormatへのパース

このQ&Aのポイント
  • 文字列のDateFormatへのパース方法を誤解している場合について解説します。
  • 特定の形式の文字列は正しくパースできるが、アルファベットの月や曜日が含まれた形式ではパースできない場合があります。
  • 基本的なデータサンプルがエラーになる場合でも、正しい結果が得られる方法をご紹介します。
回答を見る
  • ベストアンサー

文字列のDateFormatへのパース

とても単純なことを私が誤解しているのだと思うのですが、 文字列のDateFormatへのパースに関して、  DateFormat f = new SimpleDateFormat( "yyyy.MM.dd 'at' HH:mm:ss" );  try {   f.parse( "2001.07.04 at 12:08:56" );  } catch (ParseException e) {   e.printStackTrace();  } この形式だと正しくパースできるのですが、アルファベットの月や曜日が 含まれた下のような形式では、  java.text.ParseException: Unparseable date: "Wed, Jul 4, '01" 例外が発生してしまいます。  DateFormat f = new SimpleDateFormat( "EEE, MMM d, ''yy" );  try {   f.parse( "Wed, Jul 4, '01" );  } catch (ParseException e) {   e.printStackTrace();  } この下のデータサンプルはJavadocに掲載されている基本的な例ですので、 エラーになるはずはないのですが、ご助言頂ければ幸いです。

  • Java
  • 回答数2
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

ロケール指定をしていないため、ロケールが日本になるからでしょう。 JavaDocに載っているサンプルは、 ---JavaDoc抜粋-------------------------- 次の例に、U.S. ロケールで日付/時刻パターン      ~~~~~~~~~~~~~ ---------------------------------------- とありますから。 ↓を試すと納得するでしょう。 Date d = new Date(); System.out.println(f.format(d));

HarukaV49
質問者

お礼

 DateFormat f = new SimpleDateFormat( "EEE, MMM d, ''yy", Locale.US ); なるほど、LocaleをUSに設定することで解決しました。 ありがとうございました。

その他の回答 (1)

  • SSMSE
  • ベストアンサー率66% (12/18)
回答No.1

Javaは素人なので、間違っていたらごめんなさい。 下段のサンプルですが・・・ フォーマットを指定するときは'(シングルクオーテーション)を2つ重ねてエスケープしているのに、日付文字列を指定するときは'(シングルクオーテーション)は1つだけになっています。 このあたりが怪しいのでは?

関連するQ&A

  • 日本時間でparseしたい

    質問させてください。 Stringの文字列から、Dateクラスを作成する場合、以下のコードを使用すると思います。 SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd"); try { date1 = format.parse("2000/1/1"); } catch (ParseException e1) { e1.printStackTrace(); } この場合、date1にはUTFでの"2000/1/1"が代入されます。 日本時間での"2000/1/1"を代入させたいのですが、どのようにコードを書けばよいのでしょうか。 どなたかお教えください。よろしくお願いします。

    • ベストアンサー
    • Java
  • Timestamp型への変換について(Java)

    ユーザから入力された8桁の数値をTimestamp型に変換する、下記のプログラムを作成したのですが、 例えば、"20111031"を入力して実行した時に、 最終的に出力されるデータは"2011-10-31 23:59:59.0"となります。(ミリ秒部分が"0") これを、 "2011-10-31 23:59:59.9"(ミリ秒部分が"9"など)のように、 その日の時刻一杯になるような値に変換するには、 プログラムをどのように修正すれば良いでしょうか? import java.sql.Timestamp; import java.text.DateFormat; import java.text.SimpleDateFormat; public class TimeCheck { public static void main(String[] args) { String inputTime = args[0] + "235959"; DateFormat inDateFormat = new SimpleDateFormat("yyyyMMddHHmmss"); DateFormat outDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { String oldTime = outDateFormat.format(inDateFormat.parse(inputTime)); // Timestamp型に変換 Timestamp newTime = Timestamp.valueOf(oldTime); System.out.print(newTime); } catch (Exception e) { e.printStackTrace(); } } }

    • ベストアンサー
    • Java
  • 文字列を日付に変換でParseException

    文字列を日付に変換するところで、「ParseException: Unparseable date: "2013/08/06"   at java.text.DateFormat.parse(DateFormat.java:335) 」とエラー表示されました。 実際のコーディングは Date sgndate = new Date(); if(!StringUtil.isNull(rs.getString("sgnymd"))){ String lstdaysgn = rs.getString("sgnymd"); lstdaysgn = lstdaysgn.substring(0,4) + "/" + lstdaysgn.substring(5,7) + "/" +                               lstdaysgn.substring(8,10); sgndate = DateFormat.getDateInstance().parse(lstdaysgn); ・・・・・・・・・ここでエラー発生 } どこが悪いのか解りません。 よろしくご教授ください。

    • ベストアンサー
    • Java
  • 日付処理について

    いつもお世話になっております。 Java初心者です。 以下のとあるサンプルコードを理解しようと思い、調べているんですがAPI仕様などを見ても、どうも理解出来ないんです。 /** * 日付文字列をDateオブジェクトに変換します. */ public static Date stringToDate(String datestr){ Date date = null; try { date = new Date(DateFormat.getInstance().parse(datestr).getTime()); } catch (ParseException e) { } return date; } 引数;2004/11/22 00:00:00 戻り値:2004-11-22 という結果になります。 Javaに慣れてない為、 “date = new Date(DateFormat.getInstance().parse(datestr).getTime());” といったような書き方があると頭がついていけなくなる状態です。 どうか分かりやすいご説明を宜しくお願いします。

    • ベストアンサー
    • Java
  • java String型から日付型へ変換

    こんにちは 現在javaのPGで日付チェックを行いたくプログラムを組んでいるのですが、色々なサイトを見ながら以下のようなものを書きました。 しかし、動かすと必ず例外にcatchされていまいます。 なぜ例外処理をされてしまうのか、原因がわかりません。 何がいけないのでしょうか?? ご教授お願いいたします。 import java.util.Date; import java.text.DateFormat; import java.text.SimpleDateFormat; //strbeginDate, strcloseDateはフォームよりString型で受け取ります。 String strbeginDate, strcloseDate; SimpleDateFormat DatebeginDateformat = new SimpleDateFormat("YYYYMMDD"); SimpleDateFormat DatecloseDateformat = new SimpleDateFormat("YYYYMMDD"); Date datebeginDate = DatebeginDateformat.parse( strbeginDate ); Date datecloseDate = DatecloseDateformat.parse( strcloseDate ); intflag = datebeginDate.compareTo(datecloseDate);

    • ベストアンサー
    • Java
  • 日付フォーマットの変換についての質問。

    こんにちは。宜しくお願いします。 現在、String型で受け取った日付の文字列をData型にして、さらに違う日付フォーマットにするプログラミングを書いています。 具体的には、 String型の"Wed, 07 Dec 2005 00:00:00 +0900"を、 Date型の"Wed, 07 Dec 2005 00:00:00 +0900"に変更して、 同じくDate型の、"2005-12-07T00:00:00+09:00"にしたいのです。 今躓いてる点は、String型の日付をDate型に変換する所で、エラーメッセージが、” Unparseable date: "Wed, 07 Dec 2005 00:00:00 +0900"”となっており、コード修正しても上手くいきません。 現時点でのコードを記述しますので、お時間があるときにご教授お願いします。 ---- import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; /** * 時間のフォーマット変換テスト。 * */ public class testConvertTime { public static void main(String[] args) throws ParseException { String strPreTime = "Wed, 07 Dec 2005 00:00:00 +0900"; //2005-12-07T03:00:12+09:00 SimpleDateFormat sdf = new SimpleDateFormat(); //日付の出力形式を設定 sdf.applyPattern( "EEE, dd MMM yyyy HH:mm:ss Z" ); //指定したフォーマットで日付が返される Date dat = sdf.parse(strPreTime); //java.util.Date dat = sdf.parse(strPreTime); } }

    • ベストアンサー
    • Java
  • 逆コンパイルの見方について(再度)

    Jad v1.5.8e.で逆コンパイルしています。下段のParseException e;をどう理解していいか分かりません。恐らくsdfFrom.parse(val)との関係だと思うのですが public class Formatter { public Formatter() { } public static String convDateFormat(String val, String formatFrom, String formatTo) throws IllegalArgumentException { SimpleDateFormat sdfFrom; SimpleDateFormat sdfTo; if(val == null || formatFrom == null || formatTo == null) { throw new IllegalArgumentException(); } sdfFrom = Util.getSDF(formatFrom); sdfTo = Util.getSDF(formatTo); sdfFrom.setLenient(false); sdfTo.setLenient(false); return sdfTo.format(sdfFrom.parse(val)); ParseException e; e; return val; } 何卒、宜しく御願いします。

    • ベストアンサー
    • Java
  • コンパイルできない

    JAVA初心者です。 サンプルでいただいたファイルをコンパイルしようとしたのですが、 エラーが出てしまいます。 ソースを見直してみたところ問題ないようなのですが、 何がおかしいのでしょうか? ソースが長くて全部貼り付けられないのですが、 どなたかご教授お願いします。 以下、エラー内容 ---------------------------------------------------------- ScheduleAPITest.java:81: '(' または '[' がありません。 List<Member> members = new ArrayList<Member>(); ^ ScheduleAPITest.java:165: ';' がありません。 for( Event event : events ) ^ ScheduleAPITest.java:171: ')' がありません。 cbServiceClient.cleanupTransport(); ^ エラー 3 個 ----------------------------------------------------------- エラー箇所1: //Member List<Member> members = new ArrayList<Member>(); Member member1 = new Member(MemberType.USER, 1, 0); Member member2 = new Member(MemberType.USER, 2, 0); Member member3 = new Member(MemberType.USER, 3, 0); members.add(member1); members.add(member2); members.add(member3); ----- エラー箇所2,3: public void testScheduleGetEvents() throws ParseException { SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); Date start = formatter.parse("2010-05-05T10:20:00"); Date end = formatter.parse("2010-05-05T11:40:00"); ScheduleGetEvents action = new ScheduleGetEvents(start, end); OMElement element = null; try { element = cbServiceClient.sendReceive(action); } catch (AxisFault e) { e.printStackTrace(); assertTrue(false); } List<Event> events = ScheduleUtil.getEventList( element ); assertTrue( events.size() >= 1); for( Event event : events ) if( EVENT_ID.equals(event.getId()) ) return; assertTrue(false); cbServiceClient.cleanupTransport(); } ------

    • ベストアンサー
    • Java
  • javaのプログラムの質問です

    2つの時間を取得し、それらの時差を計算しそれに*300をし結果を出力するプログラムを作っています。 workspace.java package org.parking.java; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; class Parking { SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); Date dateTo1 = null; Date dateTo2 = null; private long dayDiff; public Parking() { try{ dateTo1 = sdf.parse("2017/09/14 10:00:00"); dateTo2 = sdf.parse("2017/09/15 09:00:00"); System.out.println("パーキングシステムを作りました。"); } catch (ParseException e){ e.printStackTrace(); } } public void setParking(Date dateTo1,Date dateTo2)// { long dateTimeTo = dateTo1.getTime(); long dateTimeFrom = dateTo2.getTime(); this.dayDiff = (dateTimeFrom - dateTimeTo)/(1000*60*60); } public void show() { System.out.println("日数(FROM) : " + sdf.format(dateTo1)); System.out.println("日数(TO) : " + sdf.format(dateTo2)); System.out.println("差分時間: " + this.dayDiff); System.out.println("納車してから"+ this.dayDiff +"時間が経ちましたので料金は"+ (this.dayDiff*300) +"となります。"); } } Parkingsub.java package org.parking.java; class Sample1 { public static void main(String[] args) { Parking parking1 = new Parking(); parking1.show(); } }  これで一応実行はできるんですけど、実行結果が パーキングシステムを作りました。 日数(FROM) : 2017/09/14 10:00:00 日数(TO) : 2017/09/15 09:00:00 差分時間: 0 納車してから0時間が経ちましたので料金は0となります。  となってしまうんです。いろいろやってみたんですがなかなか上手く行かなくて・・・。どなたかご教授願えませんしょうか。

    • ベストアンサー
    • Java
  • javaのsocket通信で20KB以上の文字列を

    javaのsocketについての質問です。サーバーとandroid端末で文字列のやりとりしています。 文字列は長いので、圧縮をかけ、android端末側で解凍を行っています。 そこで問題がおきました。文字データ量(20KB)が大きくなると、通信が完了せずに途中で止まってしまうのです。そこで文字列を分割(1KB毎)して送るなどを行い、しのいでおりましたが根本的の解決にはいたっていません。 InputStreamReader 、 BuffererdReader あたりを考えればいいと思うのですが、いまいち組み方がよくわからない状態です。 どなたか教えていただけないでしょうか? ============================= サーバー(PC側ソースコード)DataCompression は文字列を送って圧縮をかける独自のクラスです。 public class DataExchange extends Thread{ /* android端末とデータのやり取りをする */ private boolean DEBUG_FLAG = true; // private boolean DEBUG_FLAG = false; private InputStream is; private OutputStream os; private String sendStr; private String receiveStr; public DataExchange(InputStream is, OutputStream os, String sendStr) { this.is = is; this.os = os; this.sendStr = sendStr; } public void run() { //送信データ圧縮 DataCompression dc = new DataCompression(); byte[] sendByte = dc.getDataCompression(sendStr); //データ送信 try { os.write(sendByte); os.flush(); } catch (IOException e) { e.printStackTrace(); } if (DEBUG_FLAG) { System.out.println(os + " データ送信完了 = " + sendStr); } //データ受け取り byte[] buffer = new byte[1024]; try { int size = 0; while (size <= 0) { size = is.read(buffer); } receiveStr = new String(buffer, 0,size, "UTF8"); } catch (IOException e) { e.printStackTrace(); } if (DEBUG_FLAG) { System.out.println(is + " データ受信完了 = " + receiveStr); } } public String getReceiveStr() { return receiveStr; } } ========================================= android端末側ソースコード public class DataExchange extends Thread{ /* android端末とデータのやり取りをする */ private InputStream is; private OutputStream os; private String sendStr; private String receiveStr; public DataExchange(InputStream is, OutputStream os, String sendStr) { this.is = is; this.os = os; this.sendStr = sendStr; } public void run() { //データ受け取り byte[] buffer = new byte[4096]; try { int size = 0; while (size <= 0) { size = is.read(buffer); } receiveStr = new String(buffer, 0,size, "UTF8"); } catch (IOException e) { e.printStackTrace(); } /* 解凍 */ Inflater decompresser = new Inflater(); decompresser.setInput(buffer); int count; ByteArrayOutputStream decompos = new ByteArrayOutputStream(); while (!decompresser.finished()) { try { count = decompresser.inflate(buffer); decompos.write(buffer, 0, count); } catch (DataFormatException e) { e.printStackTrace(); } } receiveStr = decompos.toString(); System.out.println("データ受信完了 = " + receiveStr); //データ送信 try { byte[] sendByte = sendStr.getBytes("UTF8"); os.write(sendByte); os.flush(); } catch (IOException e) { e.printStackTrace(); } System.out.println("データ送信完了 = " + sendStr); } public String getReceiveStr() { return receiveStr; } }

    • ベストアンサー
    • Java

専門家に質問してみよう