Pergunta

'2009-12 Dec' should be converted to '31-DEC-2009'
'2010-09 Sep' should be converted to '30-SEP-2010'
'2010-02 Feb' should be converted to '28-FEB-2010'
'2008-02 Feb' should be converted to '29-FEB-2008'

Os valores 2009-12 DEC, 2008-02 Fev será exibido ao usuário em uma suspensão. O usuário não tem opção para selecionar o DIA.

O valor selecionado do usuário deve ser passado para o banco de dados. Mas o banco de dados espera a data no formato DD-MMM-YYYY. A consulta tem '<= USER_DATE' doença. Portanto, o último dia do mês deve ser selecionado automaticamente e passado para o banco de dados.

PL Ajude -me a escrever a função que faz o trabalho acima.

static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM MMM");

    public static String convertMapedToSqlFormat(final String maped) {
        String convertedMaped = null;
        //....
        return convertedMaped;
    }

    @Test
    public void testConvertMapedToSqlFormat() {
        String[] mapedValues = { "2009-12 Dec", "2009-11 Nov", "2009-10 Oct",
                "2009-09 Sep", "2009-08 Aug", "2009-07 Jul", "2009-06 Jun",
                "2009-05 May", "2009-04 Apr", "2009-03 Mar", "2009-02 Feb",
                "2009-01 Jan", "2008-12 Dec", "2008-11 Nov", "2008-10 Oct" };
        for (String maped : mapedValues) {
            System.out.println(convertMapedToSqlFormat(maped));
        }
    }
Foi útil?

Solução

Convertê -lo em Calendar E use Calendar#getActualMaximum() Para obter o último dia do mês e definir o dia com ele.

Exemplo de kickoff:

String oldString = "2009-12 Dec";
Calendar calendar = Calendar.getInstance();
calendar.setTime(new SimpleDateFormat("yyyy-MM").parse(oldString)); // Yes, month name is ignored but we don't need this.
calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE));
String newString = new SimpleDateFormat("dd-MMM-yyyy").format(calendar.getTime()).toUpperCase();
System.out.println(newString); // 31-DEC-2009

Outras dicas

  • Use o seu DateFormat (mas conserte para yyyy-dd MMM) para analisar a data
  • converter o Date para Calendar
  • Usar Calendar.getActualMaximim()
  • usar dd-MMM-yyyy para formatar a data obtida.
  • ligar .toUpperCase()

Então:

static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM MMM");
static SimpleDateFormat dbDateFormat = new SimpleDateFormat("yyyy-MMM-dd");

public static String convertMapedToSqlFormat(final String maped) {
    Date date = dateFormat.parse(mapped);
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
    return dbDateFormat.format(cal.getTime()).toUpperCase();
}

Algumas notas:

  • Se possível, uso Joda-Time DateTime
  • Evite ter formatos de data estritos no banco de dados.

Obtenha o ano e o mês da parte AAAA-MM da string.

Use o Joda para criar um ponto no tempo correspondente ao primeiro dia daquele mês. Mova um mês à frente e um dia para trás. Apoie o tempo para a representação de strings que você precisa.

Oi você tem que analisar seu encontro, como assim

      SimpleDateFormat df = new SimpleDateFormat("MM/dd/yyyy");
      Date du = new Date();
      du = df.parse(sDate);
      df = new SimpleDateFormat("yyyy-MM-dd");
      sDate = df.format(du);

Espero que isto ajude. Deixe -me saber se isso acontecer.

Pk

Java.Time

Muito mais fácil agora com as classes modernas do Java.Time que suplantam as aulas problemáticas antigas vistas aqui na pergunta e em outras respostas.

o Java.Time A estrutura é incorporada ao Java 8 e mais tarde. Essas aulas suplantam as antigas aulas de data e hora, como java.util.Date, .Calendar, & java.text.SimpleDateFormat.

Agora em Modo de manutenção, a Joda-Time O projeto também aconselha a migração para o Java.Time.

Para saber mais, consulte o Oracle Tutorial. E Pesquise o excesso de pilha para muitos exemplos e explicações.

Grande parte da funcionalidade Java.Time está em volta para Java 6 e 7 em Threeten-Backport e mais adaptado a Android dentro Threetenabp.

o Threeten-Extra O projeto estende Java.Time com classes adicionais. Este projeto é um terreno de prova para possíveis adições futuras ao Java.Time.

YearMonth

o YearMonth A classe fornece exatamente o que você deseja.

YearMonth start = YearMonth.of( 2008 , Month.OCTOBER );
YearMonth stop = YearMonth.of( 2009 , Month.DECEMBER );
List<YearMonth> yms = new ArrayList<>();
YearMonth ym = start ;
while( ! ym.isAfter( stop ) ) {
    yms.add( ym );
    // Set up the next loop.
    ym = ym.plusMonths( 1 ); 
}

Para apresentar, use um DateTimeFormatter Para gerar uma representação de string do YearMonth valor.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM MMM" );
f = f.withLocale( Locale.CANADA_FRENCH );  // Or Locale.US etc.
String output = ym.format( f );

Para obter o último dia do mês, interrogar o YearMonth objeto.

LocalDate endOfMonth = ym.atEndOfMonth();

Para apresentar, use um DateTimeFormatter. Deixe instanciar um formatador que localize automaticamente apropriado a um especificado Locale, ou especifique seu próprio padrão de formatação. Mostrado muitas vezes em muitas outras perguntas e respostas no transbordamento da pilha.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top