【问题标题】:java.util.date get milliseconds for y-m-d onlyjava.util.date 仅获取 y-m-d 的毫秒数
【发布时间】:2017-05-24 14:21:47
【问题描述】:

情况:有一个对象AuditLog,其中包含变量java.util.Date日期。此对象保存在 mySQL 数据库中。

@Entity
public class AuditLog implements Persistable<Long> {
    ...
    @Temporal(TemporalType.DATE)
    private Date date;
    ...
}

我正在编写一些 JUnit 测试,需要验证保存的日期是否等于实际日期。其中date 是在保存并再次加载之前实际传递给log 对象的值的本地副本。

Assert.assertEquals(date, log.getDate());

Output:
expected:<Wed May 24 15:54:40 CEST 2017> but was:<2017-05-24>

所以你可以看到日期实际上是正确的,但只有 y-m-d 然后我尝试了这个(如下)来检查毫秒是否被改变。

Assert.assertEquals(date.getTime(), log.getDate().getTime());

Output:
expected:<1495634973799> but was:<1495576800000>

现在我认为最好的方法是获取 year month day 的毫秒数。

问题:这可以相对简单地实现吗?我应该这样做吗?我认为 Date 会因为某种 数据库操作 而改变,所以调整 Test 是可以的,对吧?

【问题讨论】:

  • 请注意,获取 Date 对象的 y-m-d 取决于时区。您首先需要决定要在哪个时区执行此操作。
  • 一旦您确定了时区,使用the Java 8 date and time API 会更容易、更自然。考虑升级。
  • log.getDate() 返回哪种类型?
  • log.getDate 返回 java.util.date 日期

标签: java mysql date


【解决方案1】:

有两种方法可以做到这一点:

  • 使用本地日期:您可以将 util Date 转换为 LocalDate 并在两个对象上执行 assertEqualsLocalDate 没有时间,例如:

    Date input = new Date(); LocalDate date = input.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); System.out.println(date);

  • 使用 Apache commons 的 DateUtils: 您可以使用 truncate 方法将非日期字段设置为零,例如:

    Date input = new Date(); Date truncated = DateUtils.truncate(input, Calendar.DATE); System.out.println(truncated);

    Here's Apache 公共库的 maven 依赖项。

【讨论】:

  • 这将是一个非常好的解决方案,但assertEqualsjava.time.LocalDate&lt;2017-05-24&gt; but was: java.sql.Date&lt;2017-05-24&gt; 的不同类型而失败。
  • 在调用assertEquals之前,您需要将两个日期都转换为LocalDate
【解决方案2】:

您可以使用以下代码获取“只是日、月、年:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

public class Answer {
    public static void main(String args[]) throws ParseException {
        // parse the date and time
        String input = "Wed May 24 15:54:40 CEST 2017";
        SimpleDateFormat parser = new SimpleDateFormat("EEE MMM d HH:mm:ss zzz yyyy");
        Date date = parser.parse(input);

        // parse just the date
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        formatter.setTimeZone(TimeZone.getTimeZone("CEST"));

        String formattedDate = formatter.format(date);

        Date parsedDate = formatter.parse(formattedDate);

        System.out.println(parsedDate);

        // use https://currentmillis.com/ to check the milliseconds figures
        System.out.println("Wed May 24 15:54:40 CEST 2017 in milliseconds \t" + date.getTime());

        System.out.println("Wed May 24 00:00:00 CEST 2017 in milliseconds \t" + parsedDate.getTime());
     }
 }

第二个 SimpleDateFormat("yyyy-MM-dd");按年月日解析。

使用 Date.getTime());获取毫秒数。

输出是:

Wed May 24 15:54:40 CEST 2017 in milliseconds   1495634080000
Wed May 24 00:00:00 CEST 2017 in milliseconds   1495584000000

1495584000000 = 2017 年 5 月 24 日星期三 00:00:00(使用 https://currentmillis.com/

【讨论】:

    【解决方案3】:
    Calendar cal = GregorianCalendar.getInstance();
    cal.set(Calendar.YEAR, 2017);
    cal.set(Calendar.MONTH, 5 - 1);
    cal.set(Calendar.DAY_OF_MONTH, 24);
    cal.set(Calendar.MILLISECOND, 0);
    cal.set(Calendar.HOUR_OF_DAY, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);
    Date d = cal.getTime();
    System.out.println(d.getTime());
    

    这段代码创建了一个新的 java.util.Date,只设置了年、月和日。这个例子的结果是1495576800000,这就是你想要的。

    更短的方法是:

    Date d = new Date(0l);
    d.setYear(117);
    d.setMonth(4);
    d.setDate(24);
    d.setHours(0);
    

    【讨论】:

    • 好的,我明白了。谢谢!
    【解决方案4】:

    你应该格式化两个日期:

    Date date = new Date();
    SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd");
    dt.format(date);
    

    然后相互比较。

    【讨论】:

    • 这不起作用。然而dt.format(date) 返回一个字符串,然后等于log.getDate().toString。这是一种丑陋的解决方法
    • 您需要以同样的方式从log.getDate() 格式化日期(toString() 不起作用)。有那么丑吗?使用LocalDate 更好,我知道... :-)
    猜你喜欢
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多