Контрольные примеры JUnit для преобразования UT C в EST - PullRequest
1 голос
/ 22 января 2020

Я попытался написать класс для преобразования из часового пояса UT C в EST. Кроме того, я хочу, чтобы только часть даты была сохранена. Это работает правильно. Сейчас я ищу различные тестовые примеры JUnit для метода dateFromUtcToJavaTimeZone. Можете ли вы дать мне какие-либо предложения по этим вопросам?

package com.ssc.dmh.util.general;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

public class DateUtil {

    public static Date dateFromUtcToJavaTimeZone(Date date) {
        if (date == null) {
            return null;
        }
        String utcDateString = utcDateString(date);
        return com.ssc.dmh.util.DateUtil.stringToDate(utcDateString, "yyyy-MM-dd");
    }

    private static String utcDateString(Date date) {
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
        return dateFormat.format(date);
    }
}

1 Ответ

2 голосов
/ 22 января 2020

tl; dr

Утверждение:

myJavaUtilDate                       // An object of type `java.util.Date`, a terrible legacy class that is no longer used.
.toInstant()                         // Convert from legacy class `java.util.Date` to modern `java.time.Instant`. Both classes represent a moment in UTC.
.atZone(                             // Adjust from UTC to a time zone.
    ZoneId.of( "America/New_York" )  // Real time zone names are in format `Continent/Region`, never 2-4 letter pseudo-zones such as `EST`, `CST`, or `IST`. 
)                                    // Returns a `ZonedDateTime` object. Same moment, different wall-clock time.
.toLocalDate()                       // Extract the date only.
.toString()                          // Generate text representing that date, in standard ISO 8601 format.
.equals(
    "2020-01-23" 
)

Избегайте устаревших классов даты и времени

Вы используете ужасные классы, которые были вытеснены годами go современные java .time классы с принятием JSR 310.

LocalDate

Для значения только на дату без времени суток и без времени зона, используйте java.time.LocalDate.

Ваша входная строка соответствует стандарту ISO 8601. Классы java .time по умолчанию используют стандартные форматы при разборе / генерации строк. Так что нет необходимости в шаблонах форматирования.

LocalDate ld = LocalDate.parse( "2020-01-23" ) ; 

Преобразование устаревших объектов

Если задано java.util.Date по старому коду, который еще не обновлен до java .time , преобразуйте. Вызовите новые методы преобразования, добавленные к старым классам.

Instant instant = myJavaUtilDate.toInstant() ;

И Instant, и Date представляют момент в UT C. То есть оба имеют смещение нуля часов, минут и секунд.

В любой данный момент дата меняется по всему земному шару в зависимости от зоны. Это «завтра» в Японии и еще «вчера» в Мексике. Таким образом, вы должны указать часовой пояс, по которому вы хотите просмотреть дату.

ZoneId z = ZoneId.of( "America/New_York" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;

Извлечение значения только для даты.

LocalDate ld = zdt.toLocalDate() ;

Генерация текста и сравнение в вашем утверждении.

String output = ld.toString() ;  // Genetate text in standard ISO 8601 format. 

Table of date-time types in Java, both modern and legacy

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