2010-06-24 22 views
12

"yyyymmdd" biçiminde bir simpleDateFormat kullanarak tarihleri ​​doğrulamak ve ayrıştırmak istiyorum Bu ayrıca 10 yıl (Julius Ceasar öldükten 54 yıl sonra) ayrıştırılan 100624 izin verir. Tarihler de 1970 gibi bir şey olacak, bu yüzden SimpleDateFornat ("yymmdd") ile yerleşmek istemiyorum.java's simpledateformat içinde 4 haneli yıl zorlama

SimpleDateFormat kullanarak dört basamaklı bir yıl biçimini zorlamanın bir yolu var mı? Bir regexp testinin önünü yapmak için yakınım ama belki (Simple) DateFormat() 'ı kullanmak için akıllı bir yol var mı?

Kodu istediğimiz gibi, işler daha da karmaşıklaşıyor ve araştırmamın yarısı. Kullanılan Biçim, başlamak için yyyy-MM-dd'ydi (yanlış javadoc'a sahip olan bir değişkenden geliyordu). Ancak yyyyMMdd'nin altında bir cevapta belirtildiği gibi dört yıllık bir rakamı zorlar. Yani benim sorum "yyyy-MM-dd" biçimi için dört basamaklı bir yıl zorlamak için nasıl değiştirilir. Ve neden "yyyyMMdd" farklı davranıyor? için (ve sonra yıl bazı sona erme tarihi, büyükse kontrol edin: (M ay belirtmek için kullanılır harf, aksi you're parsing minutes! notu) yazdırır

public void testMaturity() { 
    try { 
     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 
     sdf.setLenient(false); 
     System.out.println(" " + sdf.format(sdf.parse("40-12-14"))); 
     SimpleDateFormat sdf2 = new SimpleDateFormat("yyyyMMdd"); 
     sdf.setLenient(false); 
     System.out.println(" " + sdf2.format(sdf2.parse("401214"))); 
     fail(); 
    } catch (ParseException pe) { 
     assertTrue(true); 
    } 

0040-12-14

+0

sonra yıl 10 0010 olacaktır.Bununla ilgili herhangi bir sorun görmüyorum, ilk gün (01) veya ilk ay için 1'e girmelerine izin vermeyin, bu yüzden yıllarca izin verin. – Goibniu

cevap

3

Basitçe yyyyMMdd kullanmak Örneğin, doğum tarihlerini ayrıştırırken, 1800'ün daha büyük olması, geçerli yıldan daha büyük veya eşit olan tarihler için ayrıştırma tarihleri ​​iyi olduğunda) güvenli bir bahistir).

2

Hmm.

import java.util.*; 
import java.text.*; 

public class Test 
{ 
    public static void main(String[] args) throws Exception 
    { 
     SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd"); 
     format.setLenient(true); 
     tryParse(format, "100624"); 
     format.setLenient(false); 
     tryParse(format, "100624"); 
    } 

    static void tryParse(DateFormat format, String text) 
    { 
     try 
     { 
      Date date = format.parse(text); 
      System.out.println("Parsed " + text + " to " + date); 
     } 
     catch (ParseException pe) 
     { 
      System.out.println("Failed to parse " + text); 
     } 
    } 
} 

(Ve hatta kullanılarak: hatta hafif modda - Sana ben denemek zaman zaten ayrıştırmak değil "100624" ile başlar ... ama bunun yerine "mm" nin "MM" kullanarak olmalıdır şüpheli yerine "mM" nin "aa" hala ayrıştırmak başarısız )

Baskılar:.

Failed to parse 100624 
Failed to parse 100624 

Belki bu ayrıştırmak için yönetmek olduğu kodunu gösterir misin? SimpleDateFormat nesne üzerinde setLenient(false); çağıran

+0

Teşekkürler! Test etmek için bir kod ekledim ve formatString'in beklendiği gibi olmadığını ve yyyyMMdd'nin 4 basamaklı bir yıl gereksinimini zorladığını öğrendim. Yyyy-MM-dd'nin farklı davrandığı tipik olarak kalır. –

2

deneyin - bu ayrıştırma için daha katı kurallar kullanmak yapacak (aksi takdirde girdi dizesi tam biçimini aynı değilse "akıllı" olmaya çalışacağım). Örneğin:

DateFormat df = new SimpleDateFormat("yyyyMMdd"); 
df.setLenient(false); 

Ve tabii, aylar MM değil mm olduğunu.

1

Bunun için kolay bir yol yoktur. Eğer tarihlerin 1970 gibi olabileceğini söylerseniz ana soru 700624'ün ne anlama geldiğini gösterir - 1970 veya 2070? Ya Joachim'in önerdiği gibi bir kesim tarihi uygulamanız ya da tamamen 4 haneli bir yıl geçirmeniz gerekiyor.

1

Peki bu oldukça düz ve ileridir. Bu basit adımları izleyin:

Adım 1:

try { 
    String dates = "40-12-14"; 
    String patterns = "yy-MM-dd"; 
    SimpleDateFormat format3 = new SimpleDateFormat(patterns);`` 
    java.util.Date dates1 = format3.parse(dates); 

    SimpleDateFormat sdfDates = new SimpleDateFormat("dd/MM/yyyy"); 

    String strDate1 = sdfDate.format(dates1); 
    System.out.println("Date1: " + strDate1); 

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

çıktısı verir:

tarih yyyyaagg gerektiriyorsa
Date1: 14/12/1940