Есть ли объект, чтобы получить дату и время по умолчанию в Java? - PullRequest
0 голосов
/ 19 сентября 2019

Мне нужно получить значение даты и времени по умолчанию, если передать параметр в функцию, я должен получить следующие значения:

public static main void (String [] args) throws ParseException {
    System.out.println(getTimeRange("2019-12-02 10:20:20"));
}

public static String getTimeRange(String dateString) throws ParseException {
    Calendar selecteddate = Calendar.getInstance();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");    
    selecteddate.setTime(sdf.parse(dateString));

    String startime = selecteddate.get(Calendar.HOUR_OF_DAY) + ":"
        + selecteddate.get(Calendar.MINUTE) + ":" + selecteddate.get(Calendar.SECOND);
    return "Start Time: " + startime;
}

Ответы [ 2 ]

5 голосов
/ 19 сентября 2019

Использование DateTimeFormatterBuilder для получения DateTimeFormatter, как , предложенное от vmrvictor .

Имейте в виду, что форматер может использоваться как для генерации текста, так и для синтаксического анализа.

private static final DateTimeFormatter formatter = 
    new DateTimeFormatterBuilder()
    .appendValue(YEAR)
    .optionalStart()
      .appendLiteral('-')
      .appendValue(MONTH_OF_YEAR)
      .optionalStart()
        .appendLiteral('-')
        .appendValue(DAY_OF_MONTH)
        .optionalStart()
          .appendLiteral(' ')
          .appendValue(HOUR_OF_DAY)
        .optionalEnd()
      .optionalEnd()
    .optionalEnd()
    .parseDefaulting(MONTH_OF_YEAR, 1)
    .parseDefaulting(DAY_OF_MONTH, 1)
    .parseDefaulting(HOUR_OF_DAY, 0)
    .parseDefaulting(MINUTE_OF_HOUR, 0)
    .parseDefaulting(SECOND_OF_MINUTE, 0)
    .toFormatter();


private static LocalDateTime convert(String text) {
    return LocalDateTime.parse(text, formatter);
}

Возвращенный объект LocalDateTime может быть отформатирован по желанию, но я предположил, что 2019-01-01 00:00:00 в вопросе указывает на объект, по сравнению с "2019", который представляет строку.

Результаты для данных:

"2019"  ->  2019-01-01 00:00:00
"2019-02"  ->  2019-02-01 00:00:00
"2019-06-02"  ->  2019-06-02 00:00:00
"2019-07-2 11"  ->  2019-07-02 11:00:00

Вот рабочий тестовый класс, использующий JUnit 5 Jupiter.

package work.basil.example;

import org.junit.jupiter.api.Test;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;

import static java.time.temporal.ChronoField.*;
import static org.junit.jupiter.api.Assertions.*;

public class AppTest
{
    private static final DateTimeFormatter formatterInput =
            new DateTimeFormatterBuilder ()
                    .appendValue ( YEAR )
                    .optionalStart ()
                    .appendLiteral ( '-' )
                    .appendValue ( MONTH_OF_YEAR )
                    .optionalStart ()
                    .appendLiteral ( '-' )
                    .appendValue ( DAY_OF_MONTH )
                    .optionalStart ()
                    .appendLiteral ( ' ' )
                    .appendValue ( HOUR_OF_DAY )
                    .optionalEnd ()
                    .optionalEnd ()
                    .optionalEnd ()
                    .parseDefaulting ( MONTH_OF_YEAR , 1 )
                    .parseDefaulting ( DAY_OF_MONTH , 1 )
                    .parseDefaulting ( HOUR_OF_DAY , 0 )
                    .parseDefaulting ( MINUTE_OF_HOUR , 0 )
                    .parseDefaulting ( SECOND_OF_MINUTE , 0 )
                    .toFormatter ();

    private static final DateTimeFormatter formatterOutput = DateTimeFormatter.ofPattern ( "uuuu-MM-dd HH:mm:ss" );

    @Test
    public void testFormatter ( )
    {
        assertEquals ( "2019-01-01 00:00:00" , LocalDateTime.parse ( "2019" , AppTest.formatterInput ).format ( AppTest.formatterOutput ) );
        assertEquals ( "2019-02-01 00:00:00" , LocalDateTime.parse ( "2019-02" , AppTest.formatterInput ).format ( AppTest.formatterOutput ) );
        assertEquals ( "2019-06-02 00:00:00" , LocalDateTime.parse ( "2019-06-02" , AppTest.formatterInput ).format ( AppTest.formatterOutput ) );
        assertEquals ( "2019-07-02 11:00:00" , LocalDateTime.parse ( "2019-07-2 11" , AppTest.formatterInput ).format ( AppTest.formatterOutput ) );
    }
}
3 голосов
/ 19 сентября 2019

Наиболее очевидный подход - это просто иметь «шаблонную» строку, которую вы эффективно замените на «столько данных, сколько у вас есть»:

public static String getTimeRange(String dateString) {
    // Note: you haven't told us what you want if the input is empty,
    // or longer than a full date/time
    String template = "1970-01-01 00:00:00";      
    return dateString + template.substring(dateString.length());
}

Я полагаю, что это удовлетворит все вводимые данные/ output, который вы дали.

Обратите внимание, что это не выполняет никакого анализа или какой-либо другой проверки - вы можете захотеть проанализировать результат в LocalDateTime (как говорит cricket_007, избегайте Date и Calendar, если это возможно)) для проверки.Например:

private static DateTimeFormatter parser =
    DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss", Locale.ROOT);
public static LocalDateTime getTimeRange(String dateString) {
    // Note: you haven't told us what you want if the input is empty,
    // or longer than a full date/time
    String template = "1970-01-01 00:00:00";      
    String text = dateString + template.substring(dateString.length());
    return LocalDateTime.parse(text, parser);
}

Если вы абсолютно должны использовать java.util.Date, против которого я настоятельно рекомендую, если это вообще возможно, вы можете использовать соответствующий SimpleDateFormat, который выкажется, что вы уже знаете об этом, поскольку вы используете его в вопросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...