2017-11-24 15 views
1

次の日付文字列をyyyy-MM-dd HH:mm:ss形式でutc時刻に変換するだけのサンプルコードブ​​ロックまたは提案が必要です。カスタム日付文字列(am/pmあり)をUTC日付時刻に変換する

サンプル日付文字列:2017年11月23日9時44分午前

plsは重複し

+1

これはそれを行う必要があります。DateTimeFormatter.ofPattern( "mm/dd/yyyy hh:mm a"); –

+2

@priyadarshiswain「M」、「分」は「m」、「Minute in hour」は – suvartheec

+0

[Java8 DateTimeFormatter am/pm]と重複している可能性があります(https://stackoverflow.com/questions/38250379/java8-datetimeformatter-am- pm)。質問を重複して考えないように頼んだことは分かっていますが、リンクされた質問には小文字のam/pmも含まれているので、受け入れられた答えはそれを解決します。 –

答えて

0

SimpleDateFormat's javadocすべてリストとしてこれを考えるいけないが、このような類似した問題があるが、私のテストデータは午前/ pm.Soでありますam/pmマーカーの "a"を含むオプション。あなたの場合

、次のものが必要です。

SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy hh:mm:ssa") 
+0

または "MM/dd/yyyy hh:mm a"に関する質問がなかったことに気付かなかった。 – suvartheec

+0

ありがとう。修正されました:) –

0

以下のサンプルコードが正しく変換を行う必要があります。

import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

public class DateConversion { 

    public static void main(String[] argv) { 

     SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy hh:mma"); 
     SimpleDateFormat OutputFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 

     String sampleDateString = "11/23/2017 09:44am"; 

     try { 
      Date convertDate = formatter.parse(sampleDateString); 
      System.out.println(OutputFormatter.format(convertDate)); 

     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 

    } 

} 

これは、解析する日付文字列を宣言するためのものです。まず

SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy hh:mma"); 

と出力日付だけでなく

SimpleDateFormat OutputFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
0

あなたは適切なパターンでSimpleDateFormatを作成する必要があります。このクラスは、あなたはjava.util.Datemore info here)にあなたの文字列を解析するのに役立ちます:

SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yy hh:mma"); 

あなたの元の文字列、日付は特別なタイムゾーンにある場合、あなたは、このタイムゾーンを使用するようにパーサに指示する必要があります。

SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yy hh:mma", Locale.ENGLISH); 

は、その後、あなたは、現在までに文字列を解析する必要があります。Finnaly

Date d = sdf.parse("11/23/2017 09:44am"); 

あなたはUTCにtimezoned日付を変換する必要があります。

完全なコードスニペットを怒鳴る見つけてください:

public static void main(String[] args) throws ParseException { 
    SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yy hh:mma", Locale.ENGLISH); 
    Date d = sdf.parse("11/23/2017 09:44am"); 
    System.out.println(toUtcZonedDateTime(d)); 
} 

public static ZonedDateTime toUtcZonedDateTime(final Date date) { 
    if (date == null) { 
     return null; 
    } 

    final ZoneId utcZone = ZoneOffset.UTC; 
    return ZonedDateTime.ofInstant(date.toInstant(), utcZone); 
} 

出力:

2017-11-23T08:44Z 
+0

解決していただきありがとうございます。しかし、変換されたutcの日付を文字列にしたいのですが、それを行う方法はありますか? – user2392695

+0

java.util.DateをStringに変換する2つのオプションがあります。 1つ目は、使用可能な日付にtoString()メソッドを使用することです。 2番目のオプションは、SimpleDateFormatを作成し、それを使用することです:String dateStr = sdf.format(date) – zappee

2

あなたが使用することができますJavaの8 timeパッケージ:

String input = "11/23/2017 09:44am"; 
String format = "MM/dd/yyyy hh:mma"; 

DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format); 
LocalDateTime date = LocalDateTime.parse(input, formatter); 
System.out.printf("%s%n", date); 

しかし、問題は次のとおりです。この小文字の「am」のためにDateTimeParseExceptionがスローされます。

私は文書を調べましたが、小文字の 'am'または 'pm'をmeridiemの指定子として解析する標準的な方法はありませんでした。 You'll end up manually replacing them

input = input.replace("AM", "am").replace("PM","pm"); 

コメントで@OleVVで述べたように、あなたがDateTimeFormatterBuilderを使用して構文解析で大文字と小文字を区別しないように指定することができます

DateTimeFormatter formatter = new DateTimeFormatterBuilder() 
    .parseCaseInsensitive() 
    .appendPattern(format) 
    .toFormatter(); 

次に、あなたがすることができますこのフォーマッタをLocalDateTime.parseメソッドの引数として使用してください。

上記のポストprovides a solutionの別の回答では、AM/PM記号を小文字のバリアントで上書きできます。興味深いことに


SimpleDateFormat サポート小文字の午前/午後の解析。

+0

小文字のam/pmを処理する方法:(1)解析する前に文字列全体を大文字に変換するだけです(他の文字、これは無害です)。 (2)「DateTimeFormatterBuilder」を使用して、(a)シンプル:大文字と小文字を区別しない解析を指定する(b)AMとPMに使用するリテラル文字列を指定する。 –

+0

明示的なロケールを指定することをお勧めします。 AMとPMは英語で呼ばれ、他のランゲージは他の名前を持つことがあるので、ロケールが指定されているすべてのコンピュータでコードが機能しない可能性があります。 –

関連する問題