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.