Java'da Dizeyi Takvim Nesnesine Dönüştür


175

Java için yeniyim, genellikle PHP ile çalışırım.

Bu dizeyi dönüştürmek çalışıyorum:

Pzt 14 Mar 16:02:37 GMT 2011

Bir Takvim Nesnesinin içine kolayca Yıl ve Ay bu şekilde çekebilirsiniz:

String yearAndMonth = cal.get(Calendar.YEAR)+cal.get(Calendar.MONTH);

Elle ayrıştırmak kötü bir fikir olur mu? Bir alt dize yöntemi mi kullanıyorsunuz?

Herhangi bir tavsiye teşekkür ederim!


Yanıtlar:


397
Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.ENGLISH);
cal.setTime(sdf.parse("Mon Mar 14 16:02:37 GMT 2011"));// all done

Not: Localeortamınıza / gereksiniminize göre ayarlayın


Ayrıca bakınız


onlineconversion.com/unix_time.htm . Bu çevrimiçi zaman damgası çeviricisidir. Java kodu ile hesaplanan değer ve bu çevrimiçi dönüştürme değişir. Neden?? U pls bunu geçebilir. Teşekkürler :)
Sachin J

6
Bunun saat dilimi bilgilerini kaybettiğini unutmayın. Takvim nesnesi, ayrıştırılan nesneyi değil sistem varsayılan TimeZone'u içerecektir.
Cristian Vrabie

Bu artık en üst / kabul edilen cevap olmamalıdır. Java 8 zaten 4 yıldan daha uzun bir süredir çıktığı için, yanıtın belirtilmesi için güncellenmesi gerekiyor java.time. Bu Q / A Google'da oldukça öne çıkıyor.
Scolytus

18

tl; Dr.

Modern yaklaşım java.time sınıflarını kullanır .

YearMonth.from(
    ZonedDateTime.parse( 
        "Mon Mar 14 16:02:37 GMT 2011" , 
        DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" )
     )
).toString()

2011-03

Eski tarih ve saat sınıflarından kaçının

Modern yol java.time sınıflarıdır. Gibi eski tarih-saat sınıflarıCalendar kötü tasarlanmış, kafa karıştırıcı ve zahmetli olduğu kanıtlanmıştır.

Dize girişinize uygun özel bir biçimlendirici tanımlayın.

String input = "Mon Mar 14 16:02:37 GMT 2011";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" );

Olarak ayrıştır ZonedDateTime.

ZonedDateTime zdt = ZonedDateTime.parse( input , f );

Yıl ve ay ile ilgileniyorsunuz. Java.time sınıfları YearMonthbu amaç için sınıf içerir .

YearMonth ym = YearMonth.from( zdt );

Gerekirse yıl ve ay sayılarını sorgulayabilirsiniz.

int year = ym.getYear();
int month = ym.getMonthValue();

Ancak toStringyöntem, standart ISO 8601 biçiminde bir dize oluşturur .

String output = ym.toString();

Hepsini bir araya getir.

String input = "Mon Mar 14 16:02:37 GMT 2011";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" );
ZonedDateTime zdt = ZonedDateTime.parse( input , f );
YearMonth ym = YearMonth.from( zdt );
int year = ym.getYear();
int month = ym.getMonthValue();

Konsola dökümü.

System.out.println( "input: " + input );
System.out.println( "zdt: " + zdt );
System.out.println( "ym: " + ym );

girdi: Pzt 14 Mar 16:02:37 GMT 2011

zdt: 2011-03-14T16: 02: 37Z [GMT]

ym: 2011-03

Canlı kod

IdeOne.com'da çalışan bu koda bakın .

Dönüştürmek

Eğer varsa gereken bir var Calendarnesneyi, bir dönüştürebilirsiniz GregorianCalendareski sınıflara eklenen kullanarak yeni yöntemler.

GregorianCalendar gc = GregorianCalendar.from( zdt );

Java.time hakkında

Java.time çerçevesi daha sonra Java 8 ve yerleşiktir. Bu sınıflar zahmetli eski yerini mirası gibi tarih-saat sınıfları java.util.Date, Calendar&SimpleDateFormat .

Artık bakım modunda olan Joda-Time projesi java.time'a geçişi tavsiye ediyor.

Daha fazla bilgi için Oracle Eğiticisine bakın . Ve birçok örnek ve açıklama için Stack Overflow'da arama yapın. Spesifikasyon JSR 310'dur .

Java.time sınıflarını nereden edinebilirsiniz?

ThreeTen-Ekstra proje ek sınıfları ile java.time uzanır. Bu proje, java.time'a gelecekteki olası eklemeler için bir kanıt zeminidir. Burada bazı yararlı sınıfları gibi bulabilir Interval, YearWeek, YearQuarter, ve daha .


14

Eh, sanırım zaten sınıflarda mevcut olan kodu çoğaltmak kötü bir fikir olurdu SimpleDateFormat .

Öte yandan, kişisel olarak kaçınmayı Calendarve Datetamamen yapabiliyorsanız ve Joda Time'ı daha iyi tasarlanmış bir tarih ve saat API'sı olarak kullanmanızı öneririm . Örneğin, farkında olmak gerekir SimpleDateFormatedilir değil , evreli size yani ya ihtiyaç iplik-halk, senkronizasyon veya yeni bir örneğini kullanmadan her zaman. Joda ayrıştırıcıları ve biçemleyicileri olan evreli.


Girdiğiniz için teşekkürler, kesinlikle Joda'yı gelecekte kullanmaya çalışacağım, çok yararlı olabileceği anlaşılıyor
Doug Molineux

@Jon Skeet Joda Android'de serisini kaldırmayacak. Tarih ve saati kaydetmeniz gerekmedikçe Joda'nın değeri azdır.
Frank Zappa

@FrankZappa: Buna katılmıyorum - Joda Time'daki tüm tarih / saat hesaplamalarınızı yapabilir , ancak serileştirme amacıyla diğer türlere (belki de basitlik için dizeler) dönüştürebilirsiniz.
Jon Skeet

Üzgünüm, aşağı indirmek zorunda kaldım, cevap çok eski, en üst düzey cevap olmak için modası geçmiş. Bugünjava.time gitmenin yolu, Basil Bourque mükemmel bir cevap verdi.
Scolytus

2
@Scolytus: En yüksek (ve kabul edilen) cevap bu konuda 10'a kıyasla 332 oy aldı. Sanırım şimdi daha iyi bir çözümü olan her 7 + yaşındaki cevapta aşağı iniş yaparsanız, iniş notları tükenir ... (Basil'in cevabının iyi olduğuna katılıyorum ve bunu iptal ettim.)
Jon Skeet

10

Yeni bir Takvim oluşturulması gerekmez, SimpleDateFormat zaten altında bir Takvim kullanır.

SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.EN_US);
Date date = sdf.parse("Mon Mar 14 16:02:37 GMT 2011"));// all done
Calendar cal = sdf.getCalendar();

(Henüz yorum yapamam, bu yüzden yeni bir cevap oluşturdum)


1
Çözümünüz zarif görünüyor, ancak iki dezavantajı var: 1. JavaDoc, davranışın beklendiği gibi olduğunu garanti etmez. 2. En azından Java 6 için, 1353 satırında takvim nesnesinin klonlandığı bir yol bulacaksınız. O zaman! Date.equals (cal.getTime ()).
niels

5

SimpleDateFormatharika, sadece saatlerle çalışırken HHfarklı olduğunu unutmayın hh. HHsaat 24 saat, saat 12 saat

Örneğin, aşağıdakiler 12 saatlik bir süre döndürür:

SimpleDateFormat sdf = new SimpleDateFormat("hh:mm aa");

Bu 24 saat geri dönecek olsa da:

SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");

4

Saat dilimi ile bir zamanı ayrıştırın, Zdesen zaman dilimi içindir

String aTime = "2017-10-25T11:39:00+09:00";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.getDefault());
try {
    Calendar cal = Calendar.getInstance();
    cal.setTime(sdf.parse(aTime));
    Log.i(TAG, "time = " + cal.getTimeInMillis()); 
} catch (ParseException e) {
    e.printStackTrace();
}

Çıktı: UTC saatini döndürür

1508899140000

resim açıklamasını buraya girin

Saat dilimini aşağıdaki gibi düzenleyemezsek yyyy-MM-dd'T'HH:mm:ss. SimpleDateFormatayarlanan saat dilimini kullanacaktırSetting



1

Basit yöntem:

public Calendar stringToCalendar(String date, String pattern) throws ParseException {
    String DEFAULT_LOCALE_NAME = "pt";
    String DEFAULT_COUNTRY = "BR";
    Locale DEFAULT_LOCALE = new Locale(DEFAULT_LOCALE_NAME, DEFAULT_COUNTRY);
    SimpleDateFormat format = new SimpleDateFormat(pattern, LocaleUtils.DEFAULT_LOCALE);
    Date d = format.parse(date);
    Calendar c = getCalendar();
    c.setTime(d);
    return c;
}
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.