Java dizesinde tarih biçimini değiştirme


465

StringBir randevumu temsil ediyorum .

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

Bunu a'ya dönüştürmek Dateve YYYY-MM-DDformatta çıkarmak istiyorum .

2011-01-18

Bunu nasıl başarabilirim?


Tamam, aşağıda aldığım cevaplara dayanarak, denediğim bir şey var:

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));

Ancak 02011-00-1istenen yerine çıktı 2011-01-18. Neyi yanlış yapıyorum?


163
yyyyy, yyyy ile aynı değildir. :)
Hovercraft Eels Dolu

2
Bumerang sorusu. Kullanım durumunuz nedir? Çünkü yerleşik kalıpları (DateFormat.getDateTimeInstance ()) kullanmanız mümkündür.
Paweł Dyda

11
Ay, yukarıdaki örneklerde olduğu gibi mm ile değil, biçim dizesinde MM ile temsil edilir. mm, dakika anlamına gelir.
Mike

3
Yyyy-aa-gg'yi yyyy-AA-gg'ye değiştirdim, ilk sürüm işe yaramadı
Pavlo Zvarych

Yanıtlar:


506

Kullanım LocalDateTime#parse()(veya ZonedDateTime#parse()dize bir zaman dilimi bölümünü barındırıyorsa bu) bir ayrıştırmak için Stringbir içine belli bir düzende LocalDateTime.

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

A'yı belirli bir düzende a biçiminde biçimlendirmek için LocalDateTime#format()(veya ZonedDateTime#format()) tuşunu kullanın .LocalDateTimeString

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

Ya da henüz Java 8 değilken, kullanmak SimpleDateFormat#parse()bir ayrıştırmak için Stringbir içine belli bir düzende Date.

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

A'yı belirli bir düzende a SimpleDateFormat#format()biçiminde biçimlendirmek için kullanın .DateString

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

Ayrıca bakınız:


Güncelleme : başarısız girişiminize göre: desenler büyük / küçük harfe duyarlıdır . Tek tek parçaların ne anlama geldiğini java.text.SimpleDateFormatjavadok okuyun . Yani örneğin Maylarca ve mdakikalarca duruyor . Ayrıca, yıllar yyyybeş değil dört basamaklıdır yyyyy. Yukarıda gönderdiğim kod parçacıklarına daha yakından bakın.


Tarihin "1 Eylül 2012 Pazartesi" gibi görünmesini isterseniz ne olur?
crmepham

11
@crm: Javadoc bağlantısını tıklamanız, gerekli desen karakterlerini bulmanız ve modeli buna göre değiştirmeniz yeterlidir.
BalusC

Henüz Java 8'de değilseniz, backport, ThreeTen Backport ve ardından yanıttan ilk örnekleri kullanmayı düşünün . Veya API seviyesi 26'nın altındaki Android için ThreeTenABP .
Ole VV

157

Biçimlendirme CASE-SENSITIVE şeklindedir, bu nedenle mm için ay değil MM kullanın (bu dakika içindir) ve yyyy Başvuru için aşağıdaki hile sayfasını kullanabilirsiniz.

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

Örnekler:

"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-AA-gg'T'HH: aa: ss.SSSZ" "yyyy-AA-gg'T'HH: aa: ss.SSS'Z '" olmalıdır
adil bir oyuncu

2
Hayır, eğer Z'yi tek tırnak içine koyarsanız, Z'yi çıktı olarak verir, ancak onsuz Timezone verir. Örneğin. 2014-08-14T01: 24: 57.236Z ve onsuz 2014-08-14T01: 24: 57.236-0530 -> jdk1.7
Dev

1
"yyyyy.MMMMM.dd GGG ss: dd aaa" 02001.Temmuz.04 AD 12:08 PM Aylık ekstra M not edin. Dört beş değil!
Stefano Mtangoo

4 veya daha fazla harf varsa, tam form kullanılır. böylece 4 kez m veya hatta 5 kez m kullanabilirsiniz
Dev

Bu hemen hemen dokümanların bir Kopyala Yapıştır. Hiçbir ekstra açıklama yapılmaz ve gerektiğinde daha fazla bilgi edinilebilecek belgelere bağlantı yoktur. -1. ( İşte link btw )
XenoRo

108

Yanıt elbette bir SimpleDateFormat nesnesi oluşturmak ve bunu Dizeleri Tarihe çözümlemek ve Tarihleri ​​Dizelere Biçimlendirmek için kullanmaktır. SimpleDateFormat'ı denediyseniz ve çalışmadıysa, lütfen kodunuzu ve alabileceğiniz hataları gösterin.

Ek: Dize biçimindeki "mm", "MM" ile aynı değil. MM'yi aylar, mm'yi dakikalar boyunca kullanın. Ayrıca, yyyyy, yyyy ile aynı değildir. Örneğin,:

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; içe aktar java.util.Date; public class formateDate {/ ** * @param args * @throws ParseException * / public static void main (String [] args) ParseException atar {// TODO Otomatik olarak oluşturulan yöntem saplama String date_s = "2011-01-18 00:00 : 00.0" ; SimpleDateFormat dt = yeni SimpleDateFormat ("yyyyy-aa-gg ss: dd: ss"); Tarih tarih = dt.parse (tarih_s); SimpleDateFormat dt1 = yeni SimpleDateFormat ("yyyyy-aa-gg"); System.out.println (dt1.format (tarih)); }} dışarı koymak istiyorum "2011-01-18" olmalıdır ama dışarı koymak 02011-00-1
amit4444

Orijinal soruya ek olarak girdiğiniz tüm kodları gönderin (girintili dört boşluk). Bu şekilde biçimlendirmesini koruyacak ve daha sonra okuyabiliriz.
Hovercraft Eels Dolu

1
Yukarıdaki cevabımda düzenleme konusuna bakın. "MM" biçimini kullanmanız gereken Dize biçiminde "mm" kullanıyorsunuz
Hovercraft Full Of Eels

hhsize 1-12 aralığında saat verecektir, ayazdırmak / ayrıştırmak AMveya kullanmanız gerekir PM. Saati 0-23 aralığında yazdırmak / ayrıştırmak için düğmesini kullanın HH.
Andre Holzner

22

Neden sadece bunu kullanmıyorsun?

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

Ayrıca, bu başka bir yol:

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

veya

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

Şerefe!


2
Bunu neden kullanmıyorsunuz? Çünkü (a) saat dilimi konusunu yok sayar. Tarihin belirlenmesi saat dilimine bağlıdır. Bu kod, JVM'nin varsayılan saat dilimine bağlıdır. Dolayısıyla, sonuçlar yanlışlıkla değişebilir. Ve (b) çünkü java.util.Date ve SimpleDateFormat sınıfları çok zahmetli ve kaçınılmalıdır.
Basil Bourque

2
her zaman strin döndürür, Date DateDate = df.format (yeni Date ());
Delive

15

java.timeJava 8 ve sonraki sürümlerinde paketi kullanma :

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 düzeltmelerini içerecek şekilde düzenlendi] SimpleDateFormat sınıfı hile yapmalıdır:

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"ay içinde gün" değil, "yıl içinde gün" anlamına gelir. hh"gün içinde saat (0-23)" değil, "gün içinde / saatte (1-12) saat" anlamına gelir.
BalusC

9

Diğer cevaplar doğrudur, temel olarak deseninizde yanlış sayıda "y" karakteri vardı.

Saat dilimi

Yine de bir sorun daha… Saat dilimlerini ele almadınız. Eğer amaçlanan ise UTC , o zaman öyle söyledi gerekirdi. Değilse, cevaplar tam değildir. İstediğiniz tek şey saatsiz tarih bölümü ise, sorun olmaz. Ancak, zaman içerebilecek daha fazla iş yaparsanız, bir saat dilimi belirtmelisiniz.

Joda-Time

İşte aynı kod türü, ancak üçüncü taraf açık kaynaklı Joda-Time 2.3 kitaplığını kullanma

// © 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 ) );

Çalıştırıldığında…

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

Lütfen "Tarih ve Saat Modelleri" ne bakın. 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
Kodunuzu açıklamak için lütfen yanıtlarınıza biraz bilgi ekleyin.
Kursad Gulseven

senin StringDate yönteminde SimpleDateFormat yapıcı ve sette tanımlanır formatta yapabilirsiniz göre böylece tarih dönüştürebilirsiniz o SimpleDateFormat uygulamak bundan sonra u önbelleğe tarih obj almak için kullanılabilecek bir yöntem adı getDate () vardır
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

Sadece şunu kullanabilirsiniz:

Date yourDate = new Date();

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

Mükemmel çalışıyor!


5

Subring () işlevini de kullanabilirsiniz

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

Tarihin önünde bir boşluk istiyorsanız şunu kullanın:

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

5

Java 8'i yeni deneyebilirsiniz date, Oracle belgelerinde daha fazla bilgi bulunabilir .

Veya eskisini deneyebilirsiniz

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

bir Y formu kaldırmak SimpleDateFormat dt1 = new SimpleDateFormat("yyyyy-mm-dd");olmalıdırSimpleDateFormat dt1 = new SimpleDateFormat("yyyy-mm-dd");


Tam olarak değil. Sen de doğru davaya ihtiyacın var (modern DateTimeFormatterya da modası geçmiş ile sarılmak olursa olsun SimpleDateFormat).
Ole VV

0

SimpleDateFormat dt1 = yeni SimpleDateFormat ("yyyy-aa-gg");


Bu tarih-saat dersine yıllar önce modern java.time dersleri eklenmiştir . Özellikle DateTimeFormatterve DateTimeFormatterBuilder. Önerme SimpleDateFormat2019 yılında fakir bir tavsiye.
Basil Bourque

Yanlış Buradaki biçimlendirme kodlarınız yanlış. hhsaattir.
Basil Bourque

Genellikle bir tartışma veya açıklama bekleriz. Yığın Taşması, bir snippet kitaplığından daha fazlası anlamına gelir.
Basil Bourque

0

Öncelikle 2019-12-20 10:50 AM GMT + 6: 00'dan 2019-12-20 10:50 AM değiştirmek istediğinizi varsayalım ilk olarak tarih biçimini anlamanız gerekir ilk tarih biçimi yyyy-AA-gg ss : aa zzz ve ikinci bir tarih biçimi yyyy-AA-gg ss: dd a olur

sadece bu işlevden bir dize döndür.

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;
}

Bu işlev arzu cevabınızı döndürecektir. Daha fazla özelleştirmek istiyorsanız, tarih biçimine bileşen ekleyin veya kaldırın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.