Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java sql日期时间_Java_Date_Jdbc - Fatal编程技术网

java sql日期时间

java sql日期时间,java,date,jdbc,Java,Date,Jdbc,当我将SQLDateTime插入数据库时,我得到了2007-02-07 12:00:00.00 date.setYear(Integer.valueOf(parsedDate[2].replaceAll(" ", "")) - 1900); date.setMonth(Integer.valueOf(parsedDate[0].replaceAll(" ", ""))); date.setDate(Integer.valueOf(parsedDate[1].replaceAll(" ", "")

当我将SQL
DateTime
插入数据库时,我得到了
2007-02-07 12:00:00.00

date.setYear(Integer.valueOf(parsedDate[2].replaceAll(" ", "")) - 1900);
date.setMonth(Integer.valueOf(parsedDate[0].replaceAll(" ", "")));
date.setDate(Integer.valueOf(parsedDate[1].replaceAll(" ", "")));
...
java.sql.Date sqlDate = new java.sql.Date(date.getTime());
但是我把日期做成这样:
2007-02-07 17:29:46.00

date.setYear(Integer.valueOf(parsedDate[2].replaceAll(" ", "")) - 1900);
date.setMonth(Integer.valueOf(parsedDate[0].replaceAll(" ", "")));
date.setDate(Integer.valueOf(parsedDate[1].replaceAll(" ", "")));
...
java.sql.Date sqlDate = new java.sql.Date(date.getTime());
如何获取数据库中秒数的值。它总是将其更改回
12:00:00.00

date.setYear(Integer.valueOf(parsedDate[2].replaceAll(" ", "")) - 1900);
date.setMonth(Integer.valueOf(parsedDate[0].replaceAll(" ", "")));
date.setDate(Integer.valueOf(parsedDate[1].replaceAll(" ", "")));
...
java.sql.Date sqlDate = new java.sql.Date(date.getTime());

我应该使用任何格式化程序吗?

java.sql.Date表示日期,而不是日期和时间。发件人:

为了符合SQL日期的定义,必须通过将实例关联的特定时区中的小时、分钟、秒和毫秒设置为零来“规范化”java.SQL.DATE实例包装的毫秒值

如果要存储日期和时间,应查找其他类型-例如。编辑:这并不是说要使用时间戳列类型——正如paulsm4在评论中所说,这是另一回事。但是,据我所知,JDBC只支持:

  • 日期
    (不,您也需要时间)
  • 时间
    (不,您也需要日期)
  • 时间戳
    (包括日期和时间,但您不需要时间戳SQL语义)
我希望使用Java
Timestamp
类型和DATETIME列来工作,尽管没有
Timestamp
提供的精度级别

编辑:经过进一步的研究,您可能希望使用
java.sql.Time
类型,但需要使用特殊的驱动程序参数-至少如果您使用的是Microsoft驱动程序。有关更多信息,请参阅上的这些文档。

tl;博士 如果您不理解
java.util.Date
是一个带有时间类型的日期,而其子类
java.sql.Date
则假装是一个只包含日期的类,但实际上它的时间设置为零,那么您可能会感到困惑。糟糕透顶的设计。完全避免这两类。仅使用java.time类

对于数据库中的仅日期列,请将该列定义为SQL标准
date
类型

myPreparedStatement.setObject(
    … ,
    LocalDateTime.parse( "2007-02-07 17:29:46.00".replace( " " , "T" ) )
    .toLocalDate()
)
java.time 现代方法使用添加到Java8和更高版本中的java.time类

当我向数据库中插入SQL DateTime时,我得到2007-02-07 12:00:00.00

没有像
DateTime
这样的SQL标准类型,Java中也没有这样的类。所以我不知道你在那里的意图

对于输入字符串,
2007-02-07 17:29:46.00
,将其解析为
LocalDateTime
,因为它没有任何时区或UTC偏移的指示符

这种SQL风格的格式几乎符合标准。要完全遵守,用“<代码> T < /代码>替换中间的空间。在解析/生成字符串时,java.time类默认使用ISO 8601格式

String input = "2007-02-07 17:29:46.00".replace( " " , "T" ) ;
解析

LocalDateTime ldt = LocalDateTime.parse( input ) ;
LocalDateTime
不代表一个时刻,也不是时间线上的一个点。它代表大约26-27小时范围内的潜在力矩

标准SQL确实为这样的值提供了一种数据类型,
不带时区的时间戳

智能对象,而不是哑字符串 您的整个方法都是错误的,使用遗留的日期-时间类来争论文本。而是交换java.time对象

从JDBC4.2开始,您永远不需要使用麻烦的旧java.sql类型,例如
java.sql.Date
java.sql.Timestamp
。您可以通过
setObject
/
getObject
方法直接与数据库交换java.time对象

myPreparedStatement.setObject( … , ldt ) ;
和检索

LocalDateTime ldt = myResultSet.getObject( … , LocalDateTime.class ) ;
如果您试图使用仅日期值,请使用SQL标准类型
date
和Java类
LocalDate

LocalDate ld = ldt.toLocalDate() ;
myPreparedStatement.setObject( … , ld ) ;
如何获取数据库中秒数的值

不知道你们所说的“秒值”是什么意思

也许您需要从UTC 1970年的第一刻算起的秒数

long secondsSinceEpoch = ldt.toEpochSecond() ;
如果您的目标仅仅是实例化一个
java.sql.Date
,那就不用麻烦了。不要再使用那个类。但是,仅供参考,您的具体问题可能是该课程使用的糟糕设计的副作用。
java.sql.Date
类继承自
java.util.Date
,这是一个具有时间类型的日期。
java.sql.Date
类假装是一个只包含日期的值,但实际上它的时间设置为00:00:00。更糟糕的是,文档告诉我们忽略它是一个子类的事实。不要费心去理解它;只需使用java.time即可

如果您试图单独使用一天中的时间,请提取一个
LocalTime
对象

LocalTime lt = ldt.toLocalTime() ;
如果要将一天的时间设置为零,则可能需要仅日期的值。如果是这样,请使用
LocalDate
类指定日期值,该值不包含日期时间和时区

LocalDate ld = ldt.toLocalDate() :
如果你真的想在那天的第一刻打电话给我

注意:如果您试图跟踪实际时刻、时间轴上的特定点,那么以上所有代码都是错误的。搜索堆栈溢出以了解
Instant
ZoneId
zoneDateTime
类。搜索Stack Overflow和dba.StackExchange.com以了解带时区的SQL标准类型
时间戳


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

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

从哪里获得java.time类

  • 然后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time函数