2015-03-04 2 views
0

Я пытаюсь переформатировать строку даты с помощью sdf. SDF уменьшает дату на день. Указатели были бы полезны.Java SimpleDateFormat декрементирует дату на один день

java version "1.8.0_31" Вход: ChangeDateStringFormat ("10-Mar-2015");

Код:

public static String ChangeDateStringFormat (String Input) throws InterruptedException 
{   
    System.out.print("Input Date inside ChangeDateStringFormat : " + Input); 

    SimpleDateFormat sdf = new SimpleDateFormat("MMM-dd-yyyy"); 
    sdf.setTimeZone(TimeZone.getTimeZone("MST")); 

    System.out.print(" || Output Date inside ChangeDateStringFormat : " + sdf.format(new Date(Input)) + "\n"); 
    return sdf.format(new Date(Input)); 
} 

Выход Фактическое:

Input Дата внутри ChangeDateStringFormat: 10-Mar-2015 || Выход Дата внутри ChangeDateStringFormat: Mar-09-2015

Выход я Ожидая:

Input Дата внутри ChangeDateStringFormat: 10-Mar-2015 || Выход Дата внутри ChangeDateStringFormat: Mar-10-2015

+2

В стороне, пожалуйста, следуйте соглашениям об именах Java. Это действительно снижает когнитивный диссонанс. –

+0

Используйте java.util.Calendar, чтобы описать дату. – Jens

+1

Поскольку вы используете Java 8, используйте новый API даты/времени, пожалуйста! – fge

ответ

4

Это проблема:

new Date(Input) 

Вы должны не использовать. Вместо этого, построить SimpleDateFormat для разбора ввода:

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

public class Test { 
    public static void main(String[] args) throws ParseException { 
     System.out.println(convertDateFormat("10-Mar-2015")); 
    } 

    public static String convertDateFormat(String input) throws ParseException { 
     TimeZone zone = TimeZone.getTimeZone("MST"); 
     SimpleDateFormat inputFormat = new SimpleDateFormat("dd-MMM-yyyy", Locale.US); 
     inputFormat.setTimeZone(zone); 
     SimpleDateFormat outputFormat = new SimpleDateFormat("MMM-dd-yyyy", Locale.US); 
     outputFormat.setTimeZone(zone); 

     Date date = inputFormat.parse(input); 
     return outputFormat.format(date); 
    } 
} 

Однако:

  • Если вы только разбор даты, вы бы лучше указание UTC как часовой пояс; вы не хотите, чтобы возникали проблемы из-за часовых поясов, которые переключают DST в полночь
  • Если вы собираетесь запускать этот код на Java 8 и ничего ниже, я бы настоятельно рекомендовал использовать java.time вместо Date, Calendar и т. д.
Смежные вопросы