Java dizesinden tarihe dönüşüm


886

String'2 Ocak 2010' biçimindeki bir biçimi DateJava'daki bir biçimine dönüştürmenin en iyi yolu nedir ?

Sonuç olarak, ayı, günü ve yılı tamsayı olarak kullanmak istiyorum, böylece kullanabiliyorum

Date date = new Date();
date.setMonth()..
date.setYear()..
date.setDay()..
date.setlong currentTime = date.getTime();

tarihin zamana dönüştürülmesi.


15
Yanıtların çoğunun yerel ayarlar ve zaman dilimleri gibi incelikleri yok saydığını unutmayın. Bunlardan herhangi birini kullanmadan önce Date, Calendar, TimeZone, Locale ve SimpleDateFormat sınıflarının belgelerinin yakından okunmasını öneririm.
Kristopher Johnson


7
Java 8 yeni bir Tarih / Saat API'sı sağlar. Java 8 (veya daha yenisi) kullanıyorsanız şu cevaba bir göz atmalısınız: stackoverflow.com/a/22180505/1115554
micha

2
Ayarlayıcılarının Datetümü kullanımdan kaldırıldı.
Raedwald

5
Bilginize, gibi zahmetli eski tarih-saat sınıfları java.util.Date, java.util.Calendarve java.text.SimpleTextFormatşimdi mirası supplanted, java.time sınıfları. Oracle'ın Öğreticisine bakın .
Basil Bourque

Yanıtlar:


1641

Zor yol budur ve bu java.util.Dateayarlayıcı yöntemler Java 1.1'den (1997) beri kullanımdan kaldırılmıştır. Giriş dizesiyle eşleşen bir biçim deseni kullanarak tarihi biçimlendirmeniz yeterlidirSimpleDateFormat .

Giriş dizesi olarak "2 Ocak 2010" özel durumunuzda:

  1. "Ocak" tam metin ayıdır, bu yüzden MMMMbunun için kalıbı kullanın
  2. "2", ayın kısa günüdür, bu nedenle dbunun için kalıbı kullanın .
  3. "2010" 4 basamaklı yıl, bu nedenle yyyydesen kullanın .

String string = "January 2, 2010";
DateFormat format = new SimpleDateFormat("MMMM d, yyyy", Locale.ENGLISH);
Date date = format.parse(string);
System.out.println(date); // Sat Jan 02 00:00:00 GMT 2010

Açık Localeargümanın önemine dikkat edin . Bunu atlarsanız , giriş dizesinin ay adında kullanıldığı gibi mutlaka İngilizce olmayan varsayılan yerel ayarı kullanır . Yerel ayar giriş dizesiyle eşleşmezse java.text.ParseException, biçim deseni geçerli görünse bile kafa karıştırıcı bir şekilde alırsınız .

Aşağıda , mevcut tüm biçim kalıplarını listeleyen javadoc ile alaka düzeyi bir özeti verilmiştir :

Letter  Date or Time Component  Presentation        Examples
------  ----------------------  ------------------  -------------------------------------
G       Era designator          Text                AD
y       Year                    Year                1996; 96
Y       Week year               Year                2009; 09
M/L     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 in week             Text                Tuesday; Tue
u       Day number of week      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

Kalıpların büyük / küçük harfe duyarlı olduğunu ve dört veya daha fazla karakterden oluşan metin tabanlı kalıpların tam formu temsil ettiğini unutmayın; aksi takdirde kısa veya kısaltılmış bir form varsa kullanılabilir. Yani örneğin MMMMMveya daha fazlası gereksizdir.

SimpleDateFormatBelirli bir dizeyi bugüne kadar ayrıştırmak için geçerli örneklerden bazıları şunlardır :

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

Önemli bir not olduğunu SimpleDateFormatedilir değil parçacığı güvenli. Başka bir deyişle, bunu asla statik veya örnek değişken olarak bildirip atamamalı ve daha sonra farklı yöntemlerden / iş parçacıklarından yeniden kullanmamalısınız. Her zaman yerel yöntem kapsamında yepyeni oluşturmalısınız.


Java 8 güncellemesi

Java 8 veya daha yeni bir sürüm kullanıyorsanız, bu düğmeyi kullanın DateTimeFormatter(ayrıca burada, önceden tanımlanmış tüm biçimlendiricileri ve kullanılabilir biçim kalıplarını görmek için bağlantıyı tıklayın; eğitim burada mevcuttur ). Bu yeni API, JodaTime'dan esinlenmiştir .

String string = "January 2, 2010";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM d, yyyy", Locale.ENGLISH);
LocalDate date = LocalDate.parse(string, formatter);
System.out.println(date); // 2010-01-02

Not: biçim deseniniz de zaman bölümünü içeriyorsa, LocalDateTime#parse(text, formatter)yerine kullanın LocalDate#parse(text, formatter). Biçim deseniniz de saat dilimini içeriyorsa, ZonedDateTime#parse(text, formatter)bunun yerine kullanın.

Aşağıda , mevcut tüm biçim kalıplarını listeleyen javadoc ile alaka düzeyi bir özeti verilmiştir :

Symbol  Meaning                     Presentation  Examples
------  --------------------------  ------------  ----------------------------------------------
G       era                         text          AD; Anno Domini; A
u       year                        year          2004; 04
y       year-of-era                 year          2004; 04
D       day-of-year                 number        189
M/L     month-of-year               number/text   7; 07; Jul; July; J
d       day-of-month                number        10

Q/q     quarter-of-year             number/text   3; 03; Q3; 3rd quarter
Y       week-based-year             year          1996; 96
w       week-of-week-based-year     number        27
W       week-of-month               number        4
E       day-of-week                 text          Tue; Tuesday; T
e/c     localized day-of-week       number/text   2; 02; Tue; Tuesday; T
F       week-of-month               number        3

a       am-pm-of-day                text          PM
h       clock-hour-of-am-pm (1-12)  number        12
K       hour-of-am-pm (0-11)        number        0
k       clock-hour-of-am-pm (1-24)  number        0

H       hour-of-day (0-23)          number        0
m       minute-of-hour              number        30
s       second-of-minute            number        55
S       fraction-of-second          fraction      978
A       milli-of-day                number        1234
n       nano-of-second              number        987654321
N       nano-of-day                 number        1234000000

V       time-zone ID                zone-id       America/Los_Angeles; Z; -08:30
z       time-zone name              zone-name     Pacific Standard Time; PST
O       localized zone-offset       offset-O      GMT+8; GMT+08:00; UTC-08:00;
X       zone-offset 'Z' for zero    offset-X      Z; -08; -0830; -08:30; -083015; -08:30:15;
x       zone-offset                 offset-x      +0000; -08; -0830; -08:30; -083015; -08:30:15;
Z       zone-offset                 offset-Z      +0000; -0800; -08:00;

Daha popüler desenler için önceden tanımlanmış birkaç biçimlendiriciye sahip olduğunu unutmayın . Yani, örneğin DateTimeFormatter.ofPattern("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH);, kullanabilirsiniz DateTimeFormatter.RFC_1123_DATE_TIME. Bu mümkündür, çünkü aksine SimpleDateFormatiplik emniyetlidirler. Böylece gerekirse kendinizinkini de tanımlayabilirsiniz.

Belirli bir giriş dizesi biçimi için açık bir şekilde kullanmanıza gerek yoktur: 2016-09-26T17: 44: 57Z gibi DateTimeFormatterstandart bir ISO 8601 tarihi doğrudan ile ayrıştırılabilirLocalDateTime#parse(text)ISO_LOCAL_DATE_TIME biçimlendiriciyi zaten kullandığından . Benzer şekilde, LocalDate#parse(text)zaman bileşeni olmadan bir ISO tarihini ayrıştırır (bkz. ISO_LOCAL_DATE) Ve ZonedDateTime#parse(text)bir ofset ve saat dilimi eklenmiş olarak bir ISO tarihini ayrıştırır (bkz. ISO_ZONED_DATE_TIME).


Merhaba, seçenek olarak O, UTC+08:00bunun yerine yazdırmasına nasıl izin verilir GMT+08:00. Örnek alamadım.
theGamblerRises

Tarihleri ​​ayrıştırmanın birçok yolu vardır, işte DateFormat.parse'ın çeşitli kullanım örnekleri
drorw

Merhaba BalusC, ben bir dize var 20-JUN-16 12.00.00.000000000 AM, bu Date dönüştürmek için yardıma ihtiyacım var . Yardımlarınız çok takdir !!
manned24

@mannedear oh üzgünüm .. bu benim hatamdı. Neyse cevabını burada görebilirsiniz: stackoverflow.com/questions/50982310/…
Queendevelopers

74

Ah evet yine Java Tarihi tartışması. Tarih işleme ile başa çıkmak için Date , Calendar , GregorianCalendar ve SimpleDateFormat kullanıyoruz . Örneğin, Ocak tarihinizi girdi olarak kullanmak:

Calendar mydate = new GregorianCalendar();
String mystring = "January 2, 2010";
Date thedate = new SimpleDateFormat("MMMM d, yyyy", Locale.ENGLISH).parse(mystring);
mydate.setTime(thedate);
//breakdown
System.out.println("mydate -> "+mydate);
System.out.println("year   -> "+mydate.get(Calendar.YEAR));
System.out.println("month  -> "+mydate.get(Calendar.MONTH));
System.out.println("dom    -> "+mydate.get(Calendar.DAY_OF_MONTH));
System.out.println("dow    -> "+mydate.get(Calendar.DAY_OF_WEEK));
System.out.println("hour   -> "+mydate.get(Calendar.HOUR));
System.out.println("minute -> "+mydate.get(Calendar.MINUTE));
System.out.println("second -> "+mydate.get(Calendar.SECOND));
System.out.println("milli  -> "+mydate.get(Calendar.MILLISECOND));
System.out.println("ampm   -> "+mydate.get(Calendar.AM_PM));
System.out.println("hod    -> "+mydate.get(Calendar.HOUR_OF_DAY));

Sonra bunu aşağıdaki gibi bir şeyle değiştirebilirsiniz:

Calendar now = Calendar.getInstance();
mydate.set(Calendar.YEAR,2009);
mydate.set(Calendar.MONTH,Calendar.FEBRUARY);
mydate.set(Calendar.DAY_OF_MONTH,25);
mydate.set(Calendar.HOUR_OF_DAY,now.get(Calendar.HOUR_OF_DAY));
mydate.set(Calendar.MINUTE,now.get(Calendar.MINUTE));
mydate.set(Calendar.SECOND,now.get(Calendar.SECOND));
// or with one statement
//mydate.set(2009, Calendar.FEBRUARY, 25, now.get(Calendar.HOUR_OF_DAY), now.get(Calendar.MINUTE), now.get(Calendar.SECOND));
System.out.println("mydate -> "+mydate);
System.out.println("year   -> "+mydate.get(Calendar.YEAR));
System.out.println("month  -> "+mydate.get(Calendar.MONTH));
System.out.println("dom    -> "+mydate.get(Calendar.DAY_OF_MONTH));
System.out.println("dow    -> "+mydate.get(Calendar.DAY_OF_WEEK));
System.out.println("hour   -> "+mydate.get(Calendar.HOUR));
System.out.println("minute -> "+mydate.get(Calendar.MINUTE));
System.out.println("second -> "+mydate.get(Calendar.SECOND));
System.out.println("milli  -> "+mydate.get(Calendar.MILLISECOND));
System.out.println("ampm   -> "+mydate.get(Calendar.AM_PM));
System.out.println("hod    -> "+mydate.get(Calendar.HOUR_OF_DAY));

17
Ocak ayının ay olduğunu unutmayın ... 0
Nicolas Zozol

50
String str_date = "11-June-07";
DateFormat formatter;
Date date;
formatter = new SimpleDateFormat("dd-MMM-yy");
date = formatter.parse(str_date);

13
İlk değişken için yapılmasa da, açıklamaları ve tanımları ayırmanın amacı nedir?
Peter Mortensen

43

Java 8 ile yeni bir Tarih / Saat API'sı ( JSR 310 ) alıyoruz .

Joda-Time'a güvenmeden Java 8'deki tarihi ayrıştırmak için aşağıdaki yol kullanılabilir :

 String str = "January 2nd, 2010";

// if we 2nd even we have changed in pattern also it is not working please workout with 2nd 
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM Q, yyyy", Locale.ENGLISH);
LocalDate date = LocalDate.parse(str, formatter);

// access date fields
int year = date.getYear(); // 2010
int day = date.getDayOfMonth(); // 2
Month month = date.getMonth(); // JANUARY
int monthAsInt = month.getValue(); // 1

LocalDate , bir tarihi (zaman olmadan) temsil eden standart Java 8 sınıfıdır. Tarih ve saat bilgileri içeren değerleri ayrıştırmak istiyorsanız LocalDateTime kullanmalısınız . Zaman dilimlerine sahip değerler için ZonedDateTime kullanın . Her ikisi de aşağıdakine parse()benzer bir yöntem sağlar LocalDate:

LocalDateTime dateWithTime = LocalDateTime.parse(strWithDateAndTime, dateTimeFormatter);
ZonedDateTime zoned = ZonedDateTime.parse(strWithTimeZone, zoneFormatter);

DateTimeFormatter Javadoc'daki karakterleri listeleme :

All letters 'A' to 'Z' and 'a' to 'z' are reserved as pattern letters. 
The following pattern letters are defined:

Symbol  Meaning                     Presentation      Examples
------  -------                     ------------      -------
 G       era                         text              AD; Anno Domini; A
 u       year                        year              2004; 04
 y       year-of-era                 year              2004; 04
 D       day-of-year                 number            189
 M/L     month-of-year               number/text       7; 07; Jul; July; J
 d       day-of-month                number            10

 Q/q     quarter-of-year             number/text       3; 03; Q3; 3rd quarter
 Y       week-based-year             year              1996; 96
 w       week-of-week-based-year     number            27
 W       week-of-month               number            4
 E       day-of-week                 text              Tue; Tuesday; T
 e/c     localized day-of-week       number/text       2; 02; Tue; Tuesday; T
 F       week-of-month               number            3

 a       am-pm-of-day                text              PM
 h       clock-hour-of-am-pm (1-12)  number            12
 K       hour-of-am-pm (0-11)        number            0
 k       clock-hour-of-am-pm (1-24)  number            0

 H       hour-of-day (0-23)          number            0
 m       minute-of-hour              number            30
 s       second-of-minute            number            55
 S       fraction-of-second          fraction          978
 A       milli-of-day                number            1234
 n       nano-of-second              number            987654321
 N       nano-of-day                 number            1234000000

 V       time-zone ID                zone-id           America/Los_Angeles; Z; -08:30
 z       time-zone name              zone-name         Pacific Standard Time; PST
 O       localized zone-offset       offset-O          GMT+8; GMT+08:00; UTC-08:00;
 X       zone-offset 'Z' for zero    offset-X          Z; -08; -0830; -08:30; -083015; -08:30:15;
 x       zone-offset                 offset-x          +0000; -08; -0830; -08:30; -083015; -08:30:15;
 Z       zone-offset                 offset-Z          +0000; -0800; -08:00;

Saniyenin bir kısmı nasıl işler? LocalDateTime date = LocalDateTime.parse ("20140920111713000", DateTimeFormatter.of‌ Kalıbı ("yyyyMMddHHm‌ mssSSS") kullanırsam; başarısız olur, ancak LocalDateTime date = LocalDateTime.parse ("20140920111713.000", DateTimeFormatter.o‌ fPattern ("yyyyMMddHH‌ mmss.SSS") kullanırsam; çalışıyor
reos

27

Bazı cevaplar teknik olarak doğru olsa da tavsiye edilmez.

  • Java.util.Date & Calendar sınıfları çok zahmetlidir. Tasarım ve uygulamadaki kusurlar nedeniyle bunlardan kaçının. Neyse ki, diğer iki mükemmel tarih-saat kütüphanesi seçimimiz var:
    • Joda-Time
      Bu popüler açık kaynak kodlu ücretsiz kütüphane, Java'nın çeşitli sürümlerinde kullanılabilir. Kullanımının birçok örneği StackOverflow'da bulunabilir. Bunlardan bazılarını okumak, hızlı bir şekilde hızlanmanıza yardımcı olacaktır.
    • java.time. * package
      Bu yeni sınıflar seti Joda-Time'dan esinlenilmiş ve JSR 310 tarafından tanımlanmıştır. Bu sınıflar Java 8'e yerleştirilmiştir. Bu sınıfları Java 7'ye geri yüklemek için bir proje devam etmektedir, ancak bu backporting tarafından desteklenmemektedir. Oracle.
  • Kristopher Johnson'un soru hakkındaki yorumunda doğru bir şekilde belirttiği gibi, diğer cevaplar hayati sorunları görmezden geliyor:
    • Gün Saati
      Tarihinin hem tarih bölümü hem de günün saati bölümü vardır)
    • Saat Dilimi
      Bir günün başlangıcı saat dilimine bağlıdır. Bir saat dilimi belirtmezseniz, JVM'nin varsayılan saat dilimi uygulanır. Bu, kodunuzun davranışının diğer bilgisayarlarda veya değiştirilmiş bir saat dilimi ayarıyla değişebileceği anlamına gelir. Muhtemelen istediğin şey değil.
    • Yerel Ayar Yerel
      ayar dili, ayrıştırma sırasında karşılaşılan sözcüklerin (ayın ve günün adı) nasıl yorumlanacağını belirler. ( BalusC'nin cevabı bunu düzgün bir şekilde ele alır.) Ayrıca, Yerel Ayar, tarih saatinizin dize olarak temsilini oluştururken bazı biçimlendiricilerin çıktısını etkiler.

Joda-Time

Bunu Joda-Time hakkında birkaç not takip ediyor.

Saat dilimi

In Joda-Time , bir DateTime nesnesi gerçekten kendi atanmış saat dilimini bilir. Bu , bir zaman dilimi varmış gibi görünen ama olmayan java.util.Date sınıfının karşıtlığıdır .

Aşağıdaki örnek kodda, dizeyi ayrıştıran biçimlendiriciye bir saat dilimi nesnesini nasıl geçirdiğimize dikkat edin. Bu saat dilimi, o tarih saatini o saat diliminde gerçekleşmiş olarak yorumlamak için kullanılır. Bu nedenle, bu dize girdisinin temsil ettiği saat dilimini düşünmeniz ve belirlemeniz gerekir.

Giriş dizenizde saat bölümünüz olmadığından Joda-Time, belirtilen saat diliminin günün ilk anını günün saati olarak atar. Genellikle bu, 00:00:00ancak her zaman değil, Yaz Saati Uygulaması (DST) veya diğer anormallikler nedeniyle anlamına gelir . Bu arada, aynı şeyi arayarak herhangi bir DateTime örneğine de yapabilirsiniz withTimeAtStartOfDay.

Formatlayıcı Deseni

Bir biçimlendiricinin deseninde kullanılan karakterler Joda-Time'da java.util.Date/Calendar öğesindeki karakterlere benzer, ancak tam olarak aynı değildir. Dokümanı dikkatlice okuyun.

değişmezlik

Genellikle Joda-Time'da değişmez sınıfları kullanırız. Varolan bir Date-Time nesnesini değiştirmek yerine, değişikliklerin istendiği yerler dışında çoğu yönü kopyalanan diğer nesneye dayalı yeni bir taze örnek oluşturan yöntemler diyoruz. withZoneAşağıdaki son satırdaki çağrı buna bir örnektir . değişmezlik , Joda-Time'ın iş parçacığı açısından güvenli olmasını yardımcı olur ve ayrıca bazı işleri daha net hale getirebilir.

Dönüştürmek

Joda-Time nesneleri hakkında bilmeyen diğer sınıflar / çerçevelerle kullanmak için java.util.Date nesnelerine ihtiyacınız olacaktır. Neyse ki, ileri geri hareket etmek çok kolaydır.

Bir java.util.Date nesnesinden (burada adlandırılır date) Joda-Time DateTime…

org.joda.time.DateTime dateTime = new DateTime( date, timeZone );

Joda-Time'dan java.util.Date nesnesine diğer yöne gidiyor…

java.util.Date date = dateTime.toDate();

Basit kod

String input = "January 2, 2010";

java.util.Locale locale = java.util.Locale.US;
DateTimeZone timeZone = DateTimeZone.forID( "Pacific/Honolulu" ); // Arbitrarily chosen for example.
DateTimeFormatter formatter = DateTimeFormat.forPattern( "MMMM d, yyyy" ).withZone( timeZone ).withLocale( locale );
DateTime dateTime = formatter.parseDateTime( input );

System.out.println( "dateTime: " + dateTime );
System.out.println( "dateTime in UTC/GMT: " + dateTime.withZone( DateTimeZone.UTC ) );

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

dateTime: 2010-01-02T00:00:00.000-10:00
dateTime in UTC/GMT: 2010-01-02T10:00:00.000Z

20

SimpleDateFormat sınıfıyla uğraşırken, Date'in iş parçacığı için güvenli olmadığını ve tek bir Date nesnesini birden çok iş parçacığıyla paylaşamayacağınızı hatırlamak önemlidir.

Ayrıca "m" ile "M" arasında küçük bir farkın dakikalar için ve büyük / küçük harfin ay için kullanıldığı büyük bir fark vardır. "D" ve "D" ile aynı. Bu, genellikle gözden kaçan küçük hatalara neden olabilir. Daha fazla bilgi için Javadoc veya Java'da Dizeyi Tarihe Dönüştürme Kılavuzu'na bakın.


1
Bu m / M farkı bana 5 dakika hayal kırıklığına mal oldu, işaret ettiğiniz için teşekkürler :)
Buffalo

Kimsenin bundan bahsetmediğine şaşırdım. Web uygulamalarında (veya başka bir çok iş parçacıklı uygulamada) SimpleDateFormat kullanmak büyük bir hayır. Java 7 üzerinden "FastDateFormat" kullanıyorum.
JackLThornton

18
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date date;
try {
    date = dateFormat.parse("2013-12-4");
    System.out.println(date.toString()); // Wed Dec 04 00:00:00 CST 2013

    String output = dateFormat.format(date);
    System.out.println(output); // 2013-12-04
} 
catch (ParseException e) {
    e.printStackTrace();
}

Benim için iyi çalışıyor.


5
Bu 04 Aralık Çar 00:00:00 GST 2013 çıktı olarak değil 2013-12-04 çıktı
Shams

bir ParseException try / catch
sarılmalıdır

Bu beklendiği gibi değer döndürmez. Lütfen tavsiye etmeden önce test edin
lifemoveson

7

Dize bugünü değiştirmek için SimpleDateformat kullanabilirsiniz

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String strDate = "2000-01-01";
Date date = new Date(sdf.parse(strDate).getTime());


1
SimpleDateFormat ayrıştırma yöntemi bir tarih nesnesi döndürür. Öyleyse neden Date yapıcısını kullanıyorsunuz?
nespapu

6

Ayrıca, SimpleDateFormat, GWT gibi istemci tarafı teknolojilerin bazılarında mevcut değildir .

Calendar.getInstance () için gitmek iyi bir fikirdir ve gereksiniminiz iki tarihi karşılaştırmaktır; uzun bir tarih için gitmek.


6

Kullandığımız basit iki biçimlendirici:

  1. Hangi format tarihini istiyoruz?
  2. Gerçekten hangi format tarihi var?

Tarihin tam tarih biçimini ayrıştırıyoruz:

date="2016-05-06 16:40:32";

public static String setDateParsing(String date) throws ParseException {

    // This is the format date we want
    DateFormat mSDF = new SimpleDateFormat("hh:mm a");

    // This format date is actually present
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-mm-dd hh:mm");
    return mSDF.format(formatter.parse(date));
}

5

Benim alçakgönüllü test programım. Günlük dosyalarında bulduğum biçimlendirici ve uzun tarihler aramak için kullanıyorum (ancak onları oraya koyan ...).

Test programım:

package be.test.package.time;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;

public class TimeWork {

    public static void main(String[] args) {    

        TimeZone timezone = TimeZone.getTimeZone("UTC");

        List<Long> longs = new ArrayList<>();
        List<String> strings = new ArrayList<>();

        //Formatting a date needs a timezone - otherwise the date get formatted to your system time zone.
        //Use 24h format HH. In 12h format hh can be in range 0-11, which makes 12 overflow to 0.
        DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss.SSS");
        formatter.setTimeZone(timezone);

        Date now = new Date();

        //Test dates
        strings.add(formatter.format(now));
        strings.add("01-01-1970 00:00:00.000");
        strings.add("01-01-1970 00:00:01.000");
        strings.add("01-01-1970 00:01:00.000");
        strings.add("01-01-1970 01:00:00.000");
        strings.add("01-01-1970 10:00:00.000");
        strings.add("01-01-1970 12:00:00.000");
        strings.add("01-01-1970 24:00:00.000");
        strings.add("02-01-1970 00:00:00.000");
        strings.add("01-01-1971 00:00:00.000");
        strings.add("01-01-2014 00:00:00.000");
        strings.add("31-12-1969 23:59:59.000");
        strings.add("31-12-1969 23:59:00.000");
        strings.add("31-12-1969 23:00:00.000");

        //Test data
        longs.add(now.getTime());
        longs.add(-1L);
        longs.add(0L); //Long date presentation at - midnight 1/1/1970 UTC - The timezone is important!
        longs.add(1L);
        longs.add(1000L);
        longs.add(60000L);
        longs.add(3600000L);
        longs.add(36000000L);
        longs.add(43200000L);
        longs.add(86400000L);
        longs.add(31536000000L);
        longs.add(1388534400000L);
        longs.add(7260000L);
        longs.add(1417706084037L);
        longs.add(-7260000L);

        System.out.println("===== String to long =====");

        //Show the long value of the date
        for (String string: strings) {
            try {
                Date date = formatter.parse(string);
                System.out.println("Formated date : " + string + " = Long = " + date.getTime());
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }

        System.out.println("===== Long to String =====");

        //Show the date behind the long
        for (Long lo : longs) {
            Date date = new Date(lo);
            String string = formatter.format(date);
            System.out.println("Formated date : " + string + " = Long = " + lo);        
        }
    }
}

Test sonuçları:

===== String to long =====
Formated date : 05-12-2014 10:17:34.873 = Long = 1417774654873
Formated date : 01-01-1970 00:00:00.000 = Long = 0
Formated date : 01-01-1970 00:00:01.000 = Long = 1000
Formated date : 01-01-1970 00:01:00.000 = Long = 60000
Formated date : 01-01-1970 01:00:00.000 = Long = 3600000
Formated date : 01-01-1970 10:00:00.000 = Long = 36000000
Formated date : 01-01-1970 12:00:00.000 = Long = 43200000
Formated date : 01-01-1970 24:00:00.000 = Long = 86400000
Formated date : 02-01-1970 00:00:00.000 = Long = 86400000
Formated date : 01-01-1971 00:00:00.000 = Long = 31536000000
Formated date : 01-01-2014 00:00:00.000 = Long = 1388534400000
Formated date : 31-12-1969 23:59:59.000 = Long = -1000
Formated date : 31-12-1969 23:59:00.000 = Long = -60000
Formated date : 31-12-1969 23:00:00.000 = Long = -3600000
===== Long to String =====
Formated date : 05-12-2014 10:17:34.873 = Long = 1417774654873
Formated date : 31-12-1969 23:59:59.999 = Long = -1
Formated date : 01-01-1970 00:00:00.000 = Long = 0
Formated date : 01-01-1970 00:00:00.001 = Long = 1
Formated date : 01-01-1970 00:00:01.000 = Long = 1000
Formated date : 01-01-1970 00:01:00.000 = Long = 60000
Formated date : 01-01-1970 01:00:00.000 = Long = 3600000
Formated date : 01-01-1970 10:00:00.000 = Long = 36000000
Formated date : 01-01-1970 12:00:00.000 = Long = 43200000
Formated date : 02-01-1970 00:00:00.000 = Long = 86400000
Formated date : 01-01-1971 00:00:00.000 = Long = 31536000000
Formated date : 01-01-2014 00:00:00.000 = Long = 1388534400000
Formated date : 01-01-1970 02:01:00.000 = Long = 7260000
Formated date : 04-12-2014 15:14:44.037 = Long = 1417706084037
Formated date : 31-12-1969 21:59:00.000 = Long = -7260000

2

Kaynak Bağlantı

için Android

Calendar.getInstance (). GetTime () verir

Thu Jul 26 15:54:13 GMT+05:30 2018

kullanım

String oldDate = "Thu Jul 26 15:54:13 GMT+05:30 2018";
DateFormat format = new SimpleDateFormat("EEE LLL dd HH:mm:ss Z yyyy");
Date updateLast = format.parse(oldDate);

0

Dizeden Tarihe dönüşüm:

private Date StringtoDate(String date) throws Exception {
            SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
            java.sql.Date sqlDate = null;
            if( !date.isEmpty()) {

                try {
                    java.util.Date normalDate = sdf1.parse(date);
                    sqlDate = new java.sql.Date(normalDate.getTime());
                } catch (ParseException e) {
                    throw new Exception("Not able to Parse the date", e);
                }
            }
            return sqlDate;
        }

-1

Bunu dene

String date = get_pump_data.getString("bond_end_date");
DateFormat format = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);
Date datee = (Date)format.parse(date);
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.