2011-12-15 15 views
4

変換する必要がある年を指定せずに日付を与えているようなツールがあります。私はこのタスクにJavaを使用しています(実際はGroovyですが、この場合は十分に近い)。例えば、日付は年が指定されていないため、2011年12月13日を参照してください「12月13日午前12時00分00秒」であり、それはGroovyのスクリプトん、次のトリック2011年である:年を指定しないで日付を解析するにはどうすればよいですか?

import java.text.* 
println new SimpleDateFormat("dd MMM HH:mm:ss").parse("13 Dec 12:00:00") 

私の問題このスクリプトでは、SimpleDateFormatが変換後1970年に設定を解除されているようだということです。今年は明示的に2011年に設定することができましたが、それは今年ですが、今年と設定された日付の間に若干のずれがあるようですので、新年が来るとこのスクリプトは遅れて間違ってしまいます。どうすれば簡単に解決できますか? 1つの解決策は、現在の年の日付が今度のものであるかどうかを確認してから昨年を使用することですが、もっと簡単な解決法が存在することを望んでいます。

+0

明らかに私は質問ではっきりしていませんでした。考え方は、結果の日付が後でないように、最新の年に設定することです。このスクリプトを2012年2月1日に実行しているとします。この場合、返される日付は2011年12月13日になりますが、2012年1月1日に返された日付は1/1/2012。 – dromodel

+0

私の編集をチェックしてください、それはあなたが求めているものです。 –

答えて

5

java.util.Calendarを使用すると、下の例のように現在の年を取得できます。

Calendar.getInstance().get (Calendar.YEAR); 

例は

OPは彼の質問を精緻化し、そのためのこのスニペットは、自分のニーズに合うように書き直されましたスニペット。

public static String fixDate (String data) throws Exception { 
    SimpleDateFormat dateInputFormat = new SimpleDateFormat("dd MMM HH:mm:ss"); 
    SimpleDateFormat dateOutputFormat = new SimpleDateFormat("yyyy dd MMM HH:mm:ss"); 

    Calendar currentCal = Calendar.getInstance(); 
    Calendar parsedCal = Calendar.getInstance(); 

    int CAL_YEAR = Calendar.YEAR; 

    parsedCal.setTime (dateInputFormat.parse (data)); 
    parsedCal.set  (CAL_YEAR, currentCal.get (CAL_YEAR)); 

    if (parsedCal.after (currentCal)) 
     parsedCal.set (CAL_YEAR, parsedCal.get (CAL_YEAR) - 1); 

    // Date parsedDate = parsedCal.getTime(); 

    return dateOutputFormat.format (parsedCal.getTime()); 
    } 

    public static void main (String[] args) throws Exception { 
    System.out.println (fixDate ("13 Dec 12:00:00")); 
    System.out.println (fixDate ("31 Dec 12:00:00")); 
    } 

出力

2011 12月13日12時00分00秒

2010 12月31日12時00分00秒


スローに注意することを忘れないでくださいExceptions

+0

私はフォーマットを作成していないことを知っています。私はフォーマットが何であるかを確かめていないので、推測する必要があります。 TeamCityによって、サーバーまたはエージェントによって管理されていないCVSビルド用に提供されています。バグレポートがありますが、まだ修正されていません。回避策として、私は正式な日付に正式な日付に変換することを提案します。 – dromodel

+0

さて、上記の解決法はあなたのために働くはずです。誤った日付がDateに渡されると例外がスローされるので注意してください。 –

1
String date_string = "13 Dec 12:00:00"; 
    SimpleDateFormat sdf = new SimpleDateFormat("dd MMM HH:mm:ss yyyy"); 
    Date date = sdf.parse(date_string + " " + Calendar.getInstance().get(Calendar.YEAR));   
    System.out.println(date); 

OUTPUT:

Tue Dec 13 12:00:00 IST 2011 
0

最も簡単な解決策は、あなたがそれを解析する前に日付文字列に現在の年追加することです。たとえば:

def currentYear = new Date()[Calendar.YEAR] 
def d = Date.parse("dd MMM HH:mm:ss yyyy", "13 Dec 12:00:00 " + currentYear) 
println d 
===> Tue Dec 13 12:00:00 MST 2011 
0
GregorianCalendar now = new GregorianCalendar(); 
GregorianCalendar goal= new GregorianCalendar(now.get(Calendar.YEAR), month-1, day); 
if (goal.after(now)) { 
    goal.add(Calendar.YEAR, -1); 
} 

の目標は、あなたの修正の日付を持っています。 (2014年から有効と上)

2

現代の答え:(2017)

DateTimeFormatter parseFormatter = new DateTimeFormatterBuilder() 
      .appendPattern("dd MMM HH:mm:ss") 
      .parseDefaulting(ChronoField.YEAR, Year.now(ZoneId.systemDefault()).getValue()) 
      .toFormatter(Locale.ENGLISH); 
    System.out.println(LocalDateTime.parse("13 Dec 12:00:00", parseFormatter)); 

実行している今日この版画:

2017-12-13T12:00 

メッセージ:

  • 他の回答があったが、 2011年の良い答え、クラスDateSimpleDateFormatCalendarGregorianCalendarは古くなっていますので、避けてください。現代のクラスは一般的にプログラマーにやさしく、不愉快な驚きも少なくありません。
  • 明示的なタイムゾーンを指定してください。大晦日にはコードが脆弱です。なぜなら、その年が世界中で同時に変わらないからです。
  • 明示的なロケールを指定してください。この場合、私は英語の "12月"をとり、Locale.ENGLISHを提供しました。
関連する問題