2011-12-15 4 views
4

나는 변환해야 할 연도를 지정하지 않고 날짜를 알려주는 도구를 가지고 있으며 작업을 위해 Java를 사용하고 있습니다. (실제로 Groovy이지만이 경우에는 충분히 가깝습니다). 예 날짜는 해가 지정되어 있지 않은 이후 12/13/2011을 참조해야합니다 "12월 13일 12시 0분 0초"이며는 그루비 스크립트 않습니다 다음 트릭 2011 년이다년을 지정하지 않고 단순히 날짜를 구문 분석하는 방법은 무엇입니까?

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

내 문제 이 스크립트를 사용하면 SimpleDateFormat이 변환 후 1970 년에 설정되지 않은 상태로 남겨지는 것으로 보입니다. 나는 그것이 올해로 명시 적으로 2011로 설정 될 수 있습니다. 그러나 현재 연도와 설정 한 날짜 사이에 약간의 지연이있는 것 같습니다. 그래서 새해가 올 때이 스크립트는 그 지연 시간에 잘못 될 것입니다. 어떻게 간단히 해결할 수 있습니까? 한 가지 해결책은 현재 연도의 날짜가 이후인지 확인한 다음 지난 연도를 사용하는 것입니다.하지만 더 간단한 솔루션이 존재하기를 바라고 있습니다. 그렇지 않은 경우 가장 간단한 방법입니다.

+0

명백하게 나는 질문에서 명확하지 않았다. 아이디어는 가장 최근의 연도로 설정하여 결과 날짜가 지금이 아님을 의미합니다. 이 스크립트를 2012 년 2 월 1 일에 실행하고 있다고 가정 해보십시오.이 경우 반환되는 날짜는 2011 년 12 월 13 일이 되길 원하지만 2012 년 1 월 1 일을 요청한 경우 해당 날짜는 1/1/2012. – dromodel

+0

내 편집을 확인하십시오, 당신이 요구하는 것입니다. –

답변

5

java.util.Calendar을 사용하면 아래 예처럼 현재 연도를 가져올 수 있습니다.


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

영업 이익은 자신의 질문을 정교 및 그이 조각이 자신의 필요에 맞게 다시 작성되었습니다 니펫을.

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")); 
    } 

출력

13 십이 2011 12시 0분 0초

2010 12월 31일 12시 0분 0초


던져 조심하는 것을 잊지 마십시오 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 년 좋은 대답, 클래스 Date, SimpleDateFormat, CalendarGregorianCalendar이 오래되었습니다. 따라서 피하는 것이 좋습니다.현대 클래스는 일반적으로 프로그래머에게 친숙하며 불쾌한 놀라움이 적습니다.
  • 항상 명시적인 시간대를 지정하십시오. 새해 전날에 코드가 깨지기 쉽습니다. 그 해가 전 세계에서 동시에 변하지 않기 때문입니다.
  • 항상 명시적인 로케일을 지정하십시오. 이 경우 영어로 "12 월"을 택했고 Locale.ENGLISH을 제공했습니다.
관련 문제