Как получить объект Date from Timestamp? - PullRequest
1 голос
/ 03 июля 2019

У меня дата хранится в этом формате в базе данных 2019-07-03 12:14:11 поэтому, когда я получаю ее из базы данных, она идет с отметкой времени, но мне нужна только дата, чтобы я мог использовать ее какключ моего TreeMap для заказа TreeMap на основе даты.

Например.

Предположим, у меня есть данные, связанные с этими датами, в базе данных

2019-07-03 12:14:11 and
2019-07-03 12:14:27

Теперь обе даты совпадают, но время отличается, поэтому, когда я сохраняю в своемTreeMap объект

TreeMap<Date,List<Integer>> t=new TreeMap<>();

тогда, несмотря на то, что дата одинакова, поскольку время отличается, TreeMap хранит даты в разных ключах. Я хочу, так как обе даты совпадают, поэтому данные, связанные с обеими датами, должны храниться втолько один ключ.

Если данные, связанные с первым значением adte, равны 1, а вторая дата равна 2, в TreeMap они должны храниться под одним ключом и 1, и 2 в списке, и если другие данные 3 связаны с 2019-07-01 12:12:12 тогда он должен храниться в другом ключе и ключи должны быть отсортированы

Я написал это

if(map.containsKey(invoiceHeader.getInvoice_Date()))
            {

                List<Integer> invoicesList= map.get(invoiceHeader.getInvoice_Date());
                invoicesList.add(invoiceId);
                map.put(invoiceHeader.getInvoice_Date(),invoicesList);

            }
            else {

                List<Integer> invoicesList=new ArrayList<>();
                invoicesList.add(invoiceId);
                map.put(invoiceHeader.getInvoice_Date(),invoicesList);
            }

, но здесь ключ хранит дату и время, так что даже если

2019-07-03 12:14:11 and
2019-07-03 12:14:27

- это те же 2 ключа, и 1 хранится в одном ключе, а 2 в другом ключе, так как getInvoice_Date () извлекает дату и время, сохраненные в базе данных

Как добиться того, что яВашингтоннт

Ответы [ 3 ]

3 голосов
/ 03 июля 2019

Не используйте древний java.util.Date объект. Используйте новый Java 8 Time API, то есть проанализируйте строку даты 2019-07-03 12:14:11 для объекта LocalDateTime, затем вызовите toLocalDate(), чтобы получить только дату LocalDate значение, которое будет тогда ключом к вашей карте (Map<LocalDate, List<Integer>>).

Ваш код будет:

map.computeIfAbsent(invoiceHeader.getInvoice_Date().toLocalDate(), x -> new ArrayList<>())
   .add(invoiceId);

Если getInvoice_Date() возвращает java.util.Date, тогда вы можете получить значение LocalDate, например:

Instant invoiceInstant = invoiceHeader.getInvoice_Date().toInstant();
LocalDateTime invoiceDateTime = LocalDateTime.ofInstant(invoiceInstant, ZoneId.systemDefault());
LocalDate invoiceDate = invoiceDateTime.toLocalDate();

Комбинируя код выше, вы получите:

map.computeIfAbsent(LocalDateTime.ofInstant(invoiceHeader.getInvoice_Date().toInstant(),
                                            ZoneId.systemDefault()).toLocalDate(),
                    x -> new ArrayList<>())
   .add(invoiceId);
2 голосов
/ 03 июля 2019

Здесь вы добавляете / получаете дату + время в качестве ключа на карте. Это не будет работать, потому что вы должны добавить дату без времени, если вы хотите иметь тот же ключ для той же даты, но с другим временем.
Обратите внимание, что вы должны использовать LocalDateTime вместо Date, который является более разработанным API и имеет преимущество в том, что он неизменный, что рекомендуется для ключей карты.

С несколькими изменениями вы можете сделать это:

LocalDate date = invoiceHeader.getInvoice_Date().toLocalDate();
if(map.containsKey(date)){
    map.get(date).add(invoiceId);        
}
else{    
    List<Integer> invoicesList = new ArrayList<>();
    invoicesList.add(invoiceId);
    map.put(date,invoicesList);
 }

С Map.computeIfAbsent(), который обеспечивает свободный API: вы можете упростить всю логику, такую ​​как:

LocalDate date = invoiceHeader.getInvoice_Date().toLocalDate();
map.computeIfAbsent(date, k-> new ArrayList<>()).add(invoiceId);
1 голос
/ 04 июля 2019

Предполагая, что вы храните момент в своей базе данных в столбце типа, подобного стандартному SQL TIMESTAMP WITH TIME STAMP, затем извлекаете значение из базы данных как java.time.OffsetDateTime. Класс java.util.Date ужасно несовершенен и был унаследован много лет назад с принятием JSR 310.

OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;

Вы говорите, что заботитесь только о дате. Но для получения даты требуется часовой пояс. Полученный OffsetDateTime скорее всего в UTC, хотя это зависит от вашей конкретной системы баз данных. Стандарт SQL не определяет многое о типах даты и времени. Большинство баз данных, с которыми я столкнулся, таких как Postgres и H2, настраивают любые входные данные в UTC в процессе сохранения в базу данных.

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

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;

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

LocalDate ld = zdt.toLocalDate() ;

Вы бы уже установили свой Map.

Map < LocalDate, List < Integer > > map = new TreeMap <> ( );

Давайте жестко закодируем пример вашего идентификатора счета.

Integer id = 707;

Вы можете сократить код, указанный в Вопросе, используя putIfAbsent.

map.putIfAbsent ( ld , new ArrayList <> () );

Получить List из Integer номеров идентификаторов счетов.

List< Integer > list = map.get( ld ) ;

Добавьте наш номер счета.

list.add( id ) ;

Мы можем объединить эти два последних шага в одну строку.

map.get( ld ).add( id );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...