Java文字列の日付形式を変更する


465

私がしましたString日付を表します。

String date_s = "2011-01-18 00:00:00.0";

に変換してフォーマットでDate出力したいのYYYY-MM-DDですが。

2011-01-18

どうすればこれを達成できますか?


さて、以下で検索した回答に基づいて、これが私が試したものです:

String date_s = " 2011-01-18 00:00:00.0"; 
SimpleDateFormat dt = new SimpleDateFormat("yyyyy-mm-dd hh:mm:ss"); 
Date date = dt.parse(date_s); 
SimpleDateFormat dt1 = new SimpleDateFormat("yyyyy-mm-dd");
System.out.println(dt1.format(date));

しかし、それ02011-00-1は望ましいの代わりに出力します2011-01-18。何が悪いのですか?


163
yyyyyはyyyyと同じではありません。:)
ホバークラフトいっぱいのウナギ

2
ブーメランの質問。あなたのユースケースは何ですか?組み込みパターン(DateFormat.getDateTimeInstance())を使用する必要がある可能性があるためです。
パヴェルDyda

11
月は、上記の例のようにmmではなく、フォーマット文字列でMMで表されます。mmは分を意味します。
Mike

3
yyyy-mm-ddをyyyy-MM-ddに変更したため、初期バージョンが機能しませんでした
Pavlo Zvarych

回答:


506

を使用してLocalDateTime#parse()(またはZonedDateTime#parse()文字列にタイムゾーンの部分が含まれている場合)String、特定のパターンのをに解析しLocalDateTimeます。

String oldstring = "2011-01-18 00:00:00.0";
LocalDateTime datetime = LocalDateTime.parse(oldstring, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S"));

LocalDateTime#format()(またはZonedDateTime#format())を使用LocalDateTimeしてString、aを特定のパターンでa にフォーマットします。

String newstring = datetime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
System.out.println(newstring); // 2011-01-18

または、Java 8をまだ使用SimpleDateFormat#parse()していない場合は、を使用Stringして特定のパターンのをに解析しDateます。

String oldstring = "2011-01-18 00:00:00.0";
Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S").parse(oldstring);

使用するSimpleDateFormat#format()フォーマットするDateにはString、特定のパターンで。

String newstring = new SimpleDateFormat("yyyy-MM-dd").format(date);
System.out.println(newstring); // 2011-01-18

以下も参照してください。


更新:失敗した試行に従って:パターンでは大文字と小文字が区別されます。個々のパーツが何を表すのか、java.text.SimpleDateFormatjavadocを読んでください。たとえばM、数か月とm数分を表します。また、年yyyyは5 桁ではなく4桁yyyyyです。上記でここに投稿したコードスニペットをよく見てください。


日付を「2012年9月1日月曜日」のようにしたい場合はどうしますか?
crmepham 2014年

11
@crm:javadocリンクをクリックし、そこで必要なパターン文字を見つけて、それに応じてパターンを変更します。
BalusC 2014年

Java 8をまだ使用していない場合は、バックポートThreeTenバックポートを使用することを検討してから、回答の最初の例を検討してください。または、APIレベル26未満のAndroidの場合はThreeTenABP
オレVV

157

書式設定は大文字と小文字を区別するので、mmではなく月にMMを使用します(これは分を意味します)およびyyyy 参照用に、次のチートシートを使用できます。

G   Era designator  Text    AD
y   Year    Year    1996; 96
Y   Week year   Year    2009; 09
M   Month in year   Month   July; Jul; 07
w   Week in year    Number  27
W   Week in month   Number  2
D   Day in year Number  189
d   Day in month    Number  10
F   Day of week in month    Number  2
E   Day name in week    Text    Tuesday; Tue
u   Day number of week (1 = Monday, ..., 7 = Sunday)    Number  1
a   Am/pm marker    Text    PM
H   Hour in day (0-23)  Number  0
k   Hour in day (1-24)  Number  24
K   Hour in am/pm (0-11)    Number  0
h   Hour in am/pm (1-12)    Number  12
m   Minute in hour  Number  30
s   Second in minute    Number  55
S   Millisecond Number  978
z   Time zone   General time zone   Pacific Standard Time; PST; GMT-08:00
Z   Time zone   RFC 822 time zone   -0800
X   Time zone   ISO 8601 time zone  -08; -0800; -08:00

例:

"yyyy.MM.dd G 'at' HH:mm:ss z"  2001.07.04 AD at 12:08:56 PDT
"EEE, MMM d, ''yy"  Wed, Jul 4, '01
"h:mm a"    12:08 PM
"hh 'o''clock' a, zzzz" 12 o'clock PM, Pacific Daylight Time
"K:mm a, z" 0:08 PM, PDT
"yyyyy.MMMMM.dd GGG hh:mm aaa"  02001.July.04 AD 12:08 PM
"EEE, d MMM yyyy HH:mm:ss Z"    Wed, 4 Jul 2001 12:08:56 -0700
"yyMMddHHmmssZ" 010704120856-0700
"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"   2001-07-04T12:08:56.235-0700
"yyyy-MM-dd'T'HH:mm:ss.SSSXXX"   2001-07-04T12:08:56.235-07:00
"YYYY-'W'ww-u"  2001-W27-3

1
"yyyy-MM-dd'T'HH:mm:ss.SSSZ"は "yyyy-MM-dd'T'HH:mm:ss.SSS'Z '"である必要があります
公正なプレーヤー

2
いいえ、Zを一重引用符で囲むと、Zが出力として表示されますが、Zがなければ、タイムゾーンが表示されます。例えば。2014-08-14T01:24:57.236Zおよびそれなしで2014-08-14T01:24:57.236-0530-> jdk1.7を試した
Dev

1
"yyyyy.MMMMM.dd GGG hh:mm aaa" 02001.July.04 AD 12:08 PM月の余分なMに注意してください。5つではなく4つ!
Stefano Mtangoo 14

4文字以上の場合は、完全な形式が使用されます。mを4倍、または5倍にすることもできます
Dev

これはほとんどドキュメントのコピーと貼り付けです。追加の説明は提供されておらず、必要に応じて詳細情報を取得できるドキュメントへのリンクはありません。-1。(こちらがリンクです
XenoRo

108

もちろん、答えはSimpleDateFormatオブジェクトを作成し、それを使用して文字列を日付に解析し、日付を文字列にフォーマットすることです。SimpleDateFormatを試しても動作しない場合は、コードと表示される可能性のあるエラーをすべて表示してください。

補遺:文字列形式の「mm」は「MM」と同じではありません。月にはMM、分にはmmを使用します。また、yyyyyはyyyyと同じではありません。例えば、:

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

public class FormateDate {

    public static void main(String[] args) throws ParseException {
        String date_s = "2011-01-18 00:00:00.0";

        // *** note that it's "yyyy-MM-dd hh:mm:ss" not "yyyy-mm-dd hh:mm:ss"  
        SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        Date date = dt.parse(date_s);

        // *** same for the format String below
        SimpleDateFormat dt1 = new SimpleDateFormat("yyyy-MM-dd");
        System.out.println(dt1.format(date));
    }

}

import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class formateDate {/ ** * @param args * @throws ParseException * / public static void main(String [] args)throws ParseException {// TODO自動生成されたメソッドスタブ文字列date_s = "2011-01-18 00:00 :00.0 "; SimpleDateFormat dt = new SimpleDateFormat( "yyyyy-mm-dd hh:mm:ss"); 日付date = dt.parse(date_s); SimpleDateFormat dt1 = new SimpleDateFormat( "yyyyy-mm-dd"); System.out.println(dt1.format(date)); アウトプットは「2011-01-18」である必要がありますが、アウトプットは02011-00-1です
amit4444

元の質問への追加として、コードを投稿します(4つのスペースをインデントします)。このようにして、フォーマットを保持し、それを読み取ることができます。
ホバークラフトいっぱいのウナギ

1
上記の私の回答の編集を参照してください。「MM」を使用する必要があるフォーマット文字列で「mm」を使用している
ホバークラフトフルオブイール

hh時間は1〜12の範囲で表示されます。print a/ parse AMまたはに加えて使用する必要がありますPM。時間を0〜23の範囲で出力/解析するには、を使用しますHH
Andre Holzner

22

単にこれを使用しないのはなぜですか

Date convertToDate(String receivedDate) throws ParseException{
        SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
        Date date = formatter.parse(receivedDate);
        return date;
    }

また、これは別の方法です:

DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
String requiredDate = df.format(new Date()).toString();

または

Date requiredDate = df.format(new Date());

乾杯!


2
これを使ってみませんか?(a)タイムゾーンの問題を無視しているためです。日付の決定は、タイムゾーンによって異なります。このコードは、JVMのデフォルトのタイムゾーンに依存します。そのため、結果が誤って異なる場合があります。(b)java.util.DateクラスとSimpleDateFormatクラスは厄介で悪名高いので、避ける必要があるためです。
バジルブルク2014年

2
常にstrinを返します。DaterequiredDate = df.format(new Date());
18年

15

java.timeJava 8以降でのパッケージの使用:

String date = "2011-01-18 00:00:00.0";
TemporalAccessor temporal = DateTimeFormatter
    .ofPattern("yyyy-MM-dd HH:mm:ss.S")
    .parse(date); // use parse(date, LocalDateTime::from) to get LocalDateTime
String output = DateTimeFormatter.ofPattern("yyyy-MM-dd").format(temporal);

9

[BalusCの修正を含むように編集] SimpleDateFormatクラスは、トリックを実行する必要があります。

String pattern = "yyyy-MM-dd HH:mm:ss.S";
SimpleDateFormat format = new SimpleDateFormat(pattern);
try {
  Date date = format.parse("2011-01-18 00:00:00.0");
  System.out.println(date);
} catch (ParseException e) {
  e.printStackTrace();
}

DD「月の日」ではなく「年の日」を表します。hhは、「午前/午後の時間(1〜12)」を表し、「日の時間(0〜23)」ではありません。
BalusC、2011年

9

他の答えは正解です。基本的に、パターン内の「y」文字の数が間違っていました。

タイムゾーン

ただし、もう1つ問題があります。タイムゾーンに対応していません。UTCを意図している場合は、そうする必要があります。そうでない場合、答えは完全ではありません。必要なのが時間のない日付部分だけの場合は、問題ありません。ただし、時間を伴う可能性がある作業をさらに行う場合は、タイムゾーンを指定する必要があります。

ジョーダタイム

これは同じ種類のコードですが、サードパーティのオープンソースのJoda-Time 2.3ライブラリを使用しています

// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.

String date_s = "2011-01-18 00:00:00.0";

org.joda.time.format.DateTimeFormatter formatter = org.joda.time.format.DateTimeFormat.forPattern( "yyyy-MM-dd' 'HH:mm:ss.SSS" );
// By the way, if your date-time string conformed strictly to ISO 8601 including a 'T' rather than a SPACE ' ', you could
// use a formatter built into Joda-Time rather than specify your own: ISODateTimeFormat.dateHourMinuteSecondFraction().
// Like this:
//org.joda.time.DateTime dateTimeInUTC = org.joda.time.format.ISODateTimeFormat.dateHourMinuteSecondFraction().withZoneUTC().parseDateTime( date_s );

// Assuming the date-time string was meant to be in UTC (no time zone offset).
org.joda.time.DateTime dateTimeInUTC = formatter.withZoneUTC().parseDateTime( date_s );
System.out.println( "dateTimeInUTC: " + dateTimeInUTC );
System.out.println( "dateTimeInUTC (date only): " + org.joda.time.format.ISODateTimeFormat.date().print( dateTimeInUTC ) );
System.out.println( "" ); // blank line.

// Assuming the date-time string was meant to be in Kolkata time zone (formerly known as Calcutta). Offset is +5:30 from UTC (note the half-hour).
org.joda.time.DateTimeZone kolkataTimeZone = org.joda.time.DateTimeZone.forID( "Asia/Kolkata" );
org.joda.time.DateTime dateTimeInKolkata = formatter.withZone( kolkataTimeZone ).parseDateTime( date_s );
System.out.println( "dateTimeInKolkata: " + dateTimeInKolkata );
System.out.println( "dateTimeInKolkata (date only): " + org.joda.time.format.ISODateTimeFormat.date().print( dateTimeInKolkata ) );
// This date-time in Kolkata is a different point in the time line of the Universe than the dateTimeInUTC instance created above. The date is even different.
System.out.println( "dateTimeInKolkata adjusted to UTC: " + dateTimeInKolkata.toDateTime( org.joda.time.DateTimeZone.UTC ) );

実行すると…

dateTimeInUTC: 2011-01-18T00:00:00.000Z
dateTimeInUTC (date only): 2011-01-18

dateTimeInKolkata: 2011-01-18T00:00:00.000+05:30
dateTimeInKolkata (date only): 2011-01-18
dateTimeInKolkata adjusted to UTC: 2011-01-17T18:30:00.000Z

9

こちらの「日時パターン」をご参照ください。http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

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

public class DateConversionExample{

  public static void main(String arg[]){

    try{

    SimpleDateFormat sourceDateFormat = new SimpleDateFormat("yyyy-MM-DD HH:mm:ss");

    Date date = sourceDateFormat.parse("2011-01-18 00:00:00.0");


    SimpleDateFormat targetDateFormat = new SimpleDateFormat("yyyy-MM-dd");
    System.out.println(targetDateFormat.format(date));

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

}

8
try
 {
    String date_s = "2011-01-18 00:00:00.0";
    SimpleDateFormat simpledateformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");
    Date tempDate=simpledateformat.parse(date_s);
    SimpleDateFormat outputDateFormat = new SimpleDateFormat("yyyy-MM-dd");           
    System.out.println("Output date is = "+outputDateFormat.format(tempDate));
  } catch (ParseException ex) 
  {
        System.out.println("Parse Exception");
  }

7
public class SystemDateTest {

    String stringDate;

    public static void main(String[] args) {
        SystemDateTest systemDateTest = new SystemDateTest();
        // format date into String
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss");
        systemDateTest.setStringDate(simpleDateFormat.format(systemDateTest.getDate()));
        System.out.println(systemDateTest.getStringDate());
    }

    public Date getDate() {
        return new Date();
    }

    public String getStringDate() {
        return stringDate;
    }

    public void setStringDate(String stringDate) {
        this.stringDate = stringDate;
    }
}

3
コードを説明するために、回答に情報を追加してください。
Kursad Gulseven 2017

SimpleDateFormatコンストラクターで定義された形式に従って日付を変換し、StringDateメソッドで設定して日付を変換できるように、日付をobjを取得できるメソッド名getDate()があります
Neeraj Gahlawat

6
   String str = "2000-12-12";
   Date dt = null;
   SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");

    try 
    {
         dt = formatter.parse(str);
    }
    catch (Exception e)
    {
    }

    JOptionPane.showMessageDialog(null, formatter.format(dt));

6

あなたはただ使うことができます:

Date yourDate = new Date();

SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
String date = DATE_FORMAT.format(yourDate);

それは完全に動作します!


5

substring()も使用できます

String date_s = "2011-01-18 00:00:00.0";
date_s.substring(0,10);

日付の前にスペースが必要な場合は、

String date_s = " 2011-01-18 00:00:00.0";
date_s.substring(1,11);

5

Java 8 newを試すことができますdate。詳細については、Oracleのドキュメントを参照してください。。。

または、古いものを試すことができます

public static Date getDateFromString(String format, String dateStr) {

    DateFormat formatter = new SimpleDateFormat(format);
    Date date = null;
    try {
        date = (Date) formatter.parse(dateStr);
    } catch (ParseException e) {
        e.printStackTrace();
    }

    return date;
}

public static String getDate(Date date, String dateFormat) {
    DateFormat formatter = new SimpleDateFormat(dateFormat);
    return formatter.format(date);
}

4
private SimpleDateFormat dataFormat = new SimpleDateFormat("dd/MM/yyyy");

@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    if(value instanceof Date) {
        value = dataFormat.format(value);
    }
    return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
};

3

1つのyフォームSimpleDateFormat dt1 = new SimpleDateFormat("yyyyy-mm-dd");を削除する必要がありますSimpleDateFormat dt1 = new SimpleDateFormat("yyyy-mm-dd");


ではない正確に。正しいケースも必要です(最新のものを使用するDateTimeFormatterか、古いにしがみついているかに関係なくSimpleDateFormat)。
Ole VV

0

SimpleDateFormat dt1 = new SimpleDateFormat( "yyyy-mm-dd");


この日時クラスは、数年前に現代のjava.timeクラスに取って代わられました。具体的にDateTimeFormatterDateTimeFormatterBuilderSimpleDateFormat2019年に提案するのはよくないアドバイスです。
バジルブルク

正しくありませんここのフォーマットコードは間違っています。hh時間です。
バジルブルク

通常、議論や説明を期待しています。Stack Overflowは、単なるスニペットライブラリではありません。
バジルブルク

0

2019-12-20 10:50 AM GMT + 6:00を2019-12-20 10:50 AMに変更したいとしますまず、日付形式を理解する必要があります最初の日付形式はyyyy-MM-dd hhです:mm a zzzと2番目の1つの日付形式はyyyy-MM-dd hh:mm a

この関数から文字列を返すだけです。

public String convertToOnlyDate(String currentDate) {
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm a ");
    Date date;
    String dateString = "";
    try {
        date = dateFormat.parse(currentDate);
        System.out.println(date.toString()); 

        dateString = dateFormat.format(date);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return dateString;
}

この関数はあなたの欲求の答えを返します。さらにカスタマイズしたい場合は、日付形式からコンポーネントを追加または削除してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.