2016-07-12 4 views
0

タイムスタンプのリストを読み、「最も古い」「最新」オーダーで並べ替える必要があります。しかし、私はそれらを並べ替えることができる前に、私はそれらを最初に再フォーマットする必要があります。これらのタイムスタンプは次の形式である:regexを使ってタイムスタンプを抽出して再フォーマットする方法はありますか?

ミリメートル:HHのPM/AMのDD月(egJun)YYYY、例えば

  • 15:40 2016年6月1日
  • 11:40 am 11 6月2016

私はRegexを使って各タイムスタンプを抽出し、Javaが認識するフォーマットに再フォーマットしています。 DD月(例えば6月)YYYY HH:MM

私がやったことは以下の通りである:

package regularExpressionDate; 

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class regularExpressionDate { 

    public static void main(String[] args) { 
     String pattern = "^(\\d{1,2}):(\\d{1,2})\\s(PM|AM)\\s(\\d{1,2})\\s(\\w{3})\\s(\\d{4})$"; 
     String date1 = "3:40 PM 1 Jun 2016"; 
     String newDate1; 
     int hour; 

     Pattern r = Pattern.compile(pattern); 
     Matcher m1 = r.matcher(date1); 

     if(m1.find()) { 
      hour = Integer.parseInt(m1.group(1)); 
      if(m1.group(3).equals("PM")) { 
       hour+=12; 
       System.out.println(m1.group(3)); 
      } 
      newDate1 = (m1.group(4) + " " + m1.group(5) + " " + m1.group(6) + " " + hour + ":" + m1.group(2)); 
      System.out.println(newDate1); 
     } 
     else { 
      System.out.println("No match"); 
     } 
    } 
} 

を入力3:40 PM 1 Jun 2016ために、私は1 Jun 2016 15:40を得ました。

私の質問は:

  • は私のアプローチ明快さと効率の面で私の目標を達成するための最良の方法ですか?私は、Javaに変換できるメソッドがすぐにタイムスタンプ形式を認識することを期待していましたが、私はそれを見つけられませんでした。
+3

[ 'SimpleDateFormat'](https://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html)を見てみましょうか? –

+0

@RC。、ありがとうございます –

+2

日付を解析した後に日付を並べ替えることができます。それらを文字列としてソートする必要はありません。 –

答えて

1

あなたは、コンパレータを使用して日付オブジェクトを並べ替えることができます。この後

String date = "3:40 PM 1 Jun 2016"; 

    SimpleDateFormat formatter = new SimpleDateFormat("hh:mm a dd MMM yyyy"); 
    Date startDate = formatter.parse(date); 
    System.out.println(startDate); 

のSimpleDateFormat

を使用してJavaの日にあなたの日付文字列を解析することができます。追加し Date

変換文字列の日付と:

+0

ありがとうございます。投票した。これは私の質問に対する答えです。 –

+0

あなたを助けてくれてうれしい、喜んでコーディング:) – Sanjeev

1

私はパーサーを使ってこの方法を行った。あなたが複数の空白がある場合

LocalDateTime ldt = LocalDateTime.parse("11:40 AM 11 Jun 2016", DateTimeFormatter.ofPattern("h:m a d MMM yyyy")); 
    System.out.println(ldt); 

、あなたは複数の日付、移動フォーマッタについて

String inputDate = "11:40 AM 11 Jun 2016"; 
inputDate = inputDate.replaceAll("[ ]+", " "); 

を解析する前に入力をクリアすることができます。

//BTW, it is thread-safe. 
private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("h:m a d MMM yyyy"); 


//--- 
LocalDateTime ldt = LocalDateTime.parse(input, FORMATTER); 
+1

はすべてのスペース文字をフィルタリングする方法を教えてくれました。ありがとう –

+0

ようこそ、それは簡単な方法ですが、より複雑な方法では、タブや空白のような文字を取り除く必要があります。 –

4

あなたは、あなたがこのような何かを行うことができ

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("h:mm a d MMM yyyy"); 
List<LocalDateTime> dates = 
     Stream.of("3:40 PM 1 Jun 2016", "11:40 AM 11 Jun 2016") 
       .map(text -> LocalDateTime.parse(text, formatter)) 
       .sorted() 
       .collect(Collectors.toList()); 
System.out.println(dates); 

プリント

[2016-06-01T15:40, 2016-06-11T11:40] 
+1

私はストリームAPIを表示するために投票しました。ありがとう –

+1

@YuZhang from Java 6+解析と処理に新しいJSR-310 APIを使用したい日付時刻 –

1

を解析し、ソート複数の日付へのストリームAPIを使用することができますそれらをリスト(コレクション)に分類してソートします。

hereをチェックしてください!!

// Your dates to sort 
    String dates[] = {"3:40 PM 1 Jun 2016", "11:40 AM 11 Jun 2016"}; 

    List<Date> lst = new ArrayList<>(); 
    // Your date format 
    DateFormat format = new SimpleDateFormat("hh:mm a dd MMM yyyy"); 

    for(String str : dates){ 
     //creating the collection of your dates converted to java dates 
     lst.add(format.parse(str)); 
    } 

    //sorting the dates 
    Collections.sort(lst); 

    //converting the dates into new format (if required) 
    DateFormat newFormat = new SimpleDateFormat("dd MMM yyyy HH:mm"); 
    for(Date date : lst){ 
     System.out.println(newFormat.format(date)); 
    } 
+0

ありがとうございました –

関連する問題