GVKun编程网logo

在Java中将Date对象与TimeStamp进行比较(java date对象)

27

在本文中,我们将为您详细介绍在Java中将Date对象与TimeStamp进行比较的相关知识,并且为您解答关于javadate对象的疑问,此外,我们还会提供一些关于c#–Linqtoentities将

在本文中,我们将为您详细介绍在Java中将Date对象与TimeStamp进行比较的相关知识,并且为您解答关于java date对象的疑问,此外,我们还会提供一些关于c# – Linq to entities将datetime与毫秒精度进行比较、c# – 如何将DateTime与字符串进行比较、datetime、timestamp、date、datetime、Calendar(Java)、datetime与timestamp区别的有用信息。

本文目录一览:

在Java中将Date对象与TimeStamp进行比较(java date对象)

在Java中将Date对象与TimeStamp进行比较(java date对象)

当我测试此代码时:

java.util.Date date = new java.util.Date();java.util.Date stamp = new java.sql.Timestamp(date.getTime());assertTrue(date.equals(stamp));assertTrue(date.compareTo(stamp) == 0);assertTrue(stamp.compareTo(date) == 0);assertTrue(stamp.equals(date));

我期待一个真实,真实,真实,错误。因为这:

在java.sql.Timestamp的javadoc中,它指出:

注意:此类型是java.util.Date和单独的纳秒值的组合。仅整数秒存储在java.util.Date组件中。小数秒-纳米-
是分开的。传递值java.util.Date类型的值时,Timestamp.equals(Object)方法从不返回true,因为日期的nanos组件是未知的。结果,Timestamp.equals(Object)方法相对于java.util.Date.equals(Object)方法不对称。另外,hashcode方法使用底层的java.util.Date实现,因此在其计算中不包括nanos。

由于上述Timestamp类和java.util.Date类之间的差异,建议代码不要以java.util.Date的实例的形式一般性地查看Timestamp值。Timestamp和java.util.Date之间的继承关系实际上表示实现继承,而不是类型继承。

但是相反,我会得到一个真实,错误,真实,错误的信息。有任何想法吗?

编辑:当我用equals方法检查两个日期,但其中一个Date对象来自Hibernate类并进行调试时,出现此问题,我看到该对象包含一个TimeStamp。因此equals方法的评估结果为false,然后我发现了这一点:http
//mattfleming.com/node/141

但是,当我尝试代码时,会得到不同的结果…如果我不能同时使用equals和compareTo,那我应该用什么来检查2个日期是否相同?!

答案1

小编典典

tl; dr

使用现代的 java.time 类,而不要使用那些麻烦的旧式日期时间类。

myPreparedStatement.setObject(    … ,     Instant.now()                // Capture the current moment in UTC.)

设计不好的旧日期时间类

坦率地说,java.sql.Timestamp / .Date /
.Time类是一个hack,一个糟糕的hack。像java.util.Date/.Calendar一样,它们是错误的设计选择的结果。

应该尽可能简短地使用java.sql类型,仅用于将数据移入/移出数据库。请勿用于业务逻辑和进一步的工作。

java.time

旧的日期时间类已被内置在Java
8及更高版本中的java.time框架取代。这些新类由JSR 310定义,其灵感来自于非常成功的Joda-Time库,并由ThreeTen-Extra项目扩展。

最终,我们应该看到JDBC驱动程序已更新,可以直接与这些java.time类型一起使用。但是直到那一天,我们需要转换为java.sql类型或从java.sql类型转换为。对于此类转换,请调用添加到旧类中的新方法。

一个Instant是UTC时间线的分辨率了一下纳秒。

Instant instant = myJavaSqlTimestamp.toInstant();

要走另一个方向:

java.sql.Timestamp ts = java.sql.Timestamp.valueOf( instant );

应用一个时区以获得壁钟时间。

ZoneId zoneId = ZoneId.of( "America/Montreal" );ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

java.time类具有简洁明智的类设计。因此您可以按预期使用equalscompareTo。需要注意的是有偏移的,UTC或时区的班还提供isEqualisBeforeisAfter方法。这些方法通过考虑时间轴上的时刻及其时间顺序进行比较。该equalscompareTo方法也考虑偏移或时区。

最小化java.sql的使用,同时最大化java.time的使用,使问题的讨论变得毫无意义。

在Hibernate中,将转换器用于java.time。

JDBC 4.2

从JDBC 4.2和更高版本开始,您根本不需要使用旧类。您可以通过&方法直接与数据库交换 java.time
对象。getObject``setObject

myPreparedStatement.setObject( … , instant ) ;

和检索。

Instant instant = myResultSet.getObject( … , Instant.class ) ;

注意,许多数据库无法存储分辨率与 java.time中 使用的纳秒一样精细的 时刻
。您可能想要显式截断而不是让JDBC驱动程序隐式截断。

Instant instant = Instant.now().truncatedTo( ChronoUnit.MILLIS ) ; // Lop off any nanoseconds & microseconds, keeping only the milliseconds, to match limitations of database.

关于 java.time

java.time 框架是建立在Java
8和更高版本。这些类取代麻烦的老传统日期时间类,如java.util.DateCalendar,和SimpleDateFormat

现在处于维护模式的 Joda-
Time

项目建议迁移到java.time类。

要了解更多信息,请参见
Oracle教程 。并在Stack
Overflow中搜索许多示例和说明。规格为JSR 310。

您可以直接与数据库交换 java.time 对象。使用与JDBC
4.2或更高版本兼容的JDBC驱动程序。不需要字符串,不需要类。java.sql.*

在哪里获取java.time类?

  • Java SE 8Java SE 9Java SE 10 和更高版本
    • 内置的
    • 标准Java API的一部分,具有捆绑的实现。
    • Java 9添加了一些次要功能和修复。
  • Java SE 6Java SE 7
    • java.time的许多功能在 ThreeTen- Backport中都被反向移植到Java 6和7 。
  • 安卓系统
    • 更高版本的Android捆绑了java.time类的实现。
    • 对于早期的Android(<26), ThreeTenABP 项目改编了 ThreeTen-Backport (如上所述)。请参阅 如何使用ThreeTenABP…

ThreeTen-额外
项目与其他类扩展java.time。该项目是将来可能向java.time添加内容的试验场。你可能在这里找到一些有用的类,比如IntervalYearWeekYearQuarter,和更多。

c# – Linq to entities将datetime与毫秒精度进行比较

c# – Linq to entities将datetime与毫秒精度进行比较

我有一个特定的 linq到实体查询,其编写如下:

var query = from orgs 
            in orgBaseQuery.Where(org => org.LastUpdated >= fromDate 
                                         && org.LastUpdated <= toDate)

toDate和fromDate的类型是.net DateTime,LastUpdated的类型是sql DateTime.我的问题是生成的SQL查询中没有毫秒部分,这导致我们的应用程序出现一些错误.我想知道在没有将LastUpdated的数据类型更改为datetime2的情况下是否有任何解决此问题的方法?

解决方法

如果数据库中的列是 datetime,那么您将无法获得所需的精度.它是一种遗留数据类型.从sql Server 2008(可能是R2)开始,使用的更好的数据类型是 datetime2.它是C#DateTime类型的完美匹配,包括精度.

c# – 如何将DateTime与字符串进行比较

c# – 如何将DateTime与字符串进行比较

我有一个包含时间的字符串(从DB获得):
string user_time = "17:10:03"; //Hours:minutes:seconds
DateTime time_Now = DateTime.Now;

如何将此字符串与DateTime进行比较?我想要这样的事情:

if(time_Now > user_time)
{
    //Do something
}
else
{
  //Do something
}

解决方法

DateTime支持比较,但首先需要解析日期时间字符串,DateTime.Parse()就足够了:
var dateTimeStr = "17:10:03";
var user_time = DateTime.Parse( dateTimeStr );
var time_Now = DateTime.Now;

if( time_Now > user_time )
{
  // your code...
}

请记住,比较日期/时间有时需要了解时区以使比较有意义.

datetime、timestamp、date、datetime、Calendar(Java)

datetime、timestamp、date、datetime、Calendar(Java)

datetime

   1.允许为空值、可以自定义值,系统不会自动修改其值。

   2.不可以设定默认值,所以在不允许为空值的情况下,所以手动指定datetime字段的值才能成功插入数据。

   3.虽然不可以设定默认值,但是可以指定datetime字段的值的时候使用now()变量来自动插入系统的当前时间。

   显示格式 YYYY-MM-DD HH:mm:ss 显示范围 1601-01-01 到 9999-01-01 (sql)

    end:datetime类型适合用来记录数据的原始的创建时间,因为无论你怎么更改记录中其他字段的值,datetime字段的值都不会改变,除非你手动更改它。

timestamp

  1.允许为空值,但是不可以自定义值,所以为空值时没有任何意义。

  2.默认值为CURRENT_TIMESTAMO(),其实也就是当前的系统时间。

  3.数据库会自动修改其值,所以在插入记录时不需要指定timestamp字段的名称和timestamp字段的值,你只需要在设计表的时候添加一个timestamp字段即可,对应的记录timestamp值 会自动更新为当前的系统时间。

  显示格式 YYYY-MM-DD HH:mm:ss 显示范围 1601-01-01 00:00:00 到 9999-12-31 23:59:59 (sql)

   end:timestamp类型适合记录数据的最后修改时间,因为只要你更改了记录中的其他字段的值,timestamp字段的值都会自动更新

date

   显示格式 YYYY-MM-DD 显示范围 1601-01-01 00:00:00 到 9999-12-31 23:59:59 (sql)

time:

    显示格式 HH:mm:ss 显示范围 00:00:00 到  23:59:59 (sql)

 calendar

   在处理日期和时间时,系统推荐使用Calendar进行实现。再设计上,Calendar类的功能要比Date类强大很多,而且在实现方式上也比Date类要复杂一点。

   Calednar类时抽象类,且Calendar类的构造方法时protected的,所以无法使用Calendar类的构造方法来创建对象,API提供了getInstance方法用来创建对象。

   使用该方法获取的Calendar对象就代表当前的系统时间,由于Calendar类tostring实现的没有Date类那么直观,所以直接输出Calendar类的对象意义不大。

   Calendar c1=Calendar.getInstance();

   c1.set(2019,12-1,21);

   使用Calendar类代表特定的时间,首先需要创建一个Calendar的对象,然后再谁都能该对象中的年月日参数来完成。

    以上示例设置的时间为2019年12月21日。其参数的结构和Date类不一样,Calendar类中的年份的数值直接书写,月份的值为实际的月份减1,日期的值是实际日期的值。

    Calendar.YEAR:年份、Calendar.MONTH:月份、Calendar.DATE:日期

    Calendar.DAY_OF_MONTH:日期,和上面的字段完全相同、Calendar.HOUR:12小时制的小时数、Calendar.HOUR_OF_DAY:24小时制的小时数

    Calendar.MINUTE:分钟、Calendar.SECOND:秒、Calendar.DAY_OF_WEEK:星期几

    c1.set(Calendar.DATE,10);

    该代码的作用是将c1对象代表的时间中日期设置为10号,其他所有的数值会被重新计算,例如星期几以及对应的相对时间数值等。
    Caledar c2=Calendar.getInstance(); 

    int year=c2.get(Calendar.YEAR); int month = c2.get(Calendar.MONTH) + 1; int date = c2.get(Calendar.DATE);  int hour = c2.get(Calendar.HOUR_OF_DAY);

    int minute = c2.get(Calendar.MINUTE); int second = c2.get(Calendar.SECOND); int day = c2.get(Calendar.DAY_OF_WEEK);

    get方法的声明如下: public int get(int field)

    其中参数field代表需要获得的字段的值,字段说明和上面的set方法保持一致。获得的月份为实际的月份值减1,获得的星期的值和Date类不一样。

    在Calendar类中,周日是1,周一是2,周二是3,以此类推。

 

    add方法:

    public abstract void add(int field,int amount)

    该方法的作用是在Calendar对象中的某个字段上增加或减少一定的数值,增加是amount的值为正,减少时amount的值为负。

    c2.add(Calendar.DATE, 100);

   这里add方法是指在c2对象的Calendar.DATE,也就是日期字段上增加100,类内部会重新计算该日期对象中其它各字段的值,从而获得100天以后的日期

 

   after方法:

   public boolean after(Object when)

   该方法的作用是判断当前日期对象是否在when对象的后面,如果在when对象的后面则返回true,否则返回false。例如:

   Calendar c4 = Calendar.getInstance();

   c4.set(2009, 10 - 1, 10);

   Calendar c5 = Calendar.getInstance();

   c5.set(2010, 10 - 1, 10);

   boolean b = c5.after(c4);

   在该示例代码中对象c4代表的时间是2009年10月10号,对象c5代表的时间是2010年10月10号,则对象c5代表的日期在c4代表的日期之后,所以after方法的返回值是true。

   另外一个类似的方法是before,该方法是判断当前日期对象是否位于另外一个日期对象之前。

 

   getTime方法:

   public final Date getTime()

   该方法的作用是将Calendar类型的对象转换为对应的Date类对象,两者代表相同的时间点。

   类似的方法是setTime,该方法的作用是将Date对象转换为对应的Calendar对象,该方法的声明如下:

   public final void setTime(Date date)

   转换的示例代码如下: 

   public final void setTime(Date date)

   转换的示例代码如下:

   Date d = new Date();

  Calendar c6 = Calendar.getInstance();

  //Calendar类型的对象转换为Date对象

  Date d1 = c6.getTime();

  //Date类型的对象转换为Calendar对象

  Calendar c7 = Calendar.getInstance();

  c7.setTime(d);


  Calendar对象和相对时间之间的互转:

  Calendar c8 = Calendar.getInstance();

  long t = 1252785271098L;

  //将Calendar对象转换为相对时间

  long t1 = c8.getTimeInMillis();

  //将相对时间转换为Calendar对象

  Calendar c9 = Calendar.getInstance();

  c9.setTimeInMillis(t1);

  在转换时,使用Calendar类中的getTimeInMillis方法可以将转换为相对时间。在将相对时间转换为Calendar对象时,首先要创建一个Calendar对象,然后再使用Calendar类的setTimeInMillis方法设置时间即可。

   

datetime与timestamp区别

datetime与timestamp区别

datetime与timestamp区别

  1. 支持时间范围不同:datetime 是1001 ~ 9999年,timestamp 1970 ~ 2038年
  2. datetime与时区无关,timestamp与时区有关
  3. datetime存储空间为8字节,timestamp为4字节
  4. datetime默认为null,timestamp默认为当前时间

我们今天的关于在Java中将Date对象与TimeStamp进行比较java date对象的分享就到这里,谢谢您的阅读,如果想了解更多关于c# – Linq to entities将datetime与毫秒精度进行比较、c# – 如何将DateTime与字符串进行比较、datetime、timestamp、date、datetime、Calendar(Java)、datetime与timestamp区别的相关信息,可以在本站进行搜索。

本文标签: