首页 > 解决方案 > 如何从时间戳对象中获取日期?

问题描述

我在数据库 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 在 List 中,如果另一个数据 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() 正在获取存储在数据库中的日期和时间

如何实现我想要的?

标签: java

解决方案


不要使用古代java.util.Date物品。2019-07-03 12:14:11使用新的 Java 8 Time API,即将日期字符串解析为LocalDateTime对象,然后调用toLocalDate()以获取仅限日期的LocalDate值,该值将成为地图 ( Map<LocalDate, List<Integer>>) 中的键。

您的代码将是:

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

如果getInvoice_Date()返回 a 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);

推荐阅读