JDBC数据库操作_07时间处理_Date_Time_Timestamp区别

java.util.Date包

  1. 子类:java.sql.Date——表示年月日
  2. 子类:java.sql.Time——表示时分秒
  3. 子类:java.sql.Timestamp——表示年月日时分秒
    注:时间是从1970年1月1日开始,单位是毫秒,用long类型存储.
package com.first.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
import java.util.Random;


/**
 * 测试时间处理(java.sql.Date,Time,Timestamp)
 *
 */
public class Demo07 {
	public static void main(String[] args) {
		Connection conn = null;
		PreparedStatement ps = null;
		try {
			//加载驱动类
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc","root","root");
			

				ps = conn.prepareStatement("insert into t_user (username,pwd,regTime,lastLoginTime) values (?,?,?,?)");
				ps.setObject(1, "代红");
				ps.setObject(2, "123");

				//java.sql.Date()需要传入一个long值 
				java.sql.Date date = new java.sql.Date(System.currentTimeMillis());
				Timestamp stamp = new Timestamp(System.currentTimeMillis());  
				//如果需要插入指定日期,可以使用Calendar、DateFormat
				 
				ps.setDate(3, date);
				ps.setTimestamp(4, stamp);
				ps.execute();

			System.out.println("插入一个用户");
		
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			try {
				if(ps!=null){
					ps.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
			try {
				if(conn!=null){
					conn.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}

日期比较处理

  1. 插入随机日期
  2. 取出指定日期范围的记录
    代码是修改上面的:
package com.first.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
import java.util.Random;

public class Demo07 {
	public static void main(String[] args) {
		Connection conn = null;
		PreparedStatement ps = null;
		try {
			//加载驱动类
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc","root","root");
			
			for(int i=0;i<1000;i++){
				
				ps = conn.prepareStatement("insert into t_user (username,pwd,regTime,lastLoginTime) values (?,?,?,?)");
				ps.setObject(1, "代红"+i);
				ps.setObject(2, "123");

				int rand =  100000000+new Random().nextInt(1000000000);
				
				//java.sql.Date()需要传入一个long值 
				java.sql.Date date = new java.sql.Date(System.currentTimeMillis()-rand);
				Timestamp stamp = new Timestamp(System.currentTimeMillis()-rand);  
				//如果需要插入指定日期,可以使用Calendar、DateFormat
				
				ps.setDate(3, date);
				ps.setTimestamp(4, stamp);
				ps.execute();
							
			}
		System.out.println("插入一个用户");
			
			
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			try {
				if(ps!=null){
					ps.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
			try {
				if(conn!=null){
					conn.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}

部分结果如下:在这里插入图片描述
注:

  1. random.nextInt() 为 java.util.Random类中的方法(Random类中的nextXxxx系列方法生成0-n的随机数)
  2. Math.random() 为 java.lang.Math 类中的静态方法(Math.random() 方法生成[0, 1)范围内的double类型随机数)
<think> 我们正在讨论Python中`target_date.timestamp()`的返回值。根据Python的`datetime`模块文档,`datetime.timestamp()`方法返回一个浮点数,表示自Unix纪元(1970年1月1日00:00:00 UTC)以来的秒数,即Unix时间戳。 重要说明: - 如果`target_date`是一个naive datetime对象(即不带时区信息),Python会假设这个datetime对象处于本地时间(即系统时区),然后将其转换为UTC时间再计算时间戳。 - 如果`target_date`是一个aware datetime对象(带有时区信息),则直接根据其时区信息转换为UTC时间戳。 因此,`target_date.timestamp()`的返回值是一个浮点数,代表从1970-01-01 00:00:00 UTC到`target_date`所表示的时间点所经过的秒数(可能包含小数部分,表示毫秒或微秒)。 举例说明: 假设`target_date`为北京时间2025-09-08 20:32:00(即UTC时间2025-09-08 12:32:00,因为北京时间为UTC+8),那么: - 如果`target_date`设置为naive(不带时区),且系统时区为UTC+8,则`target_date.timestamp()`将返回1757345520.0。 - 如果`target_date`设置为aware,并且时区为UTC+8,那么同样会返回1757345520.0(因为从UTC时间1970-01-01 00:00:00到2025-09-08 12:32:00 UTC刚好是1757345520秒)。 注意:同一个时间点(无论时区)对应同一个时间戳(因为时间戳是相对于UTC的)。 下面我们用代码示例说明: 示例1:naive datetime对象(假设本地时区为UTC+8) ```python from datetime import datetime import pytz # 创建一个naive datetime对象,表示2025-09-08 20:32:00(假设这是本地时间,即UTC+8) naive_date = datetime(2025, 9, 8, 20, 32, 0) # 将其转换为时间戳(Python会假设这个naive时间是系统时区的时间,然后转换为UTC) timestamp = naive_date.timestamp() print(timestamp) # 输出:1757345520.0 (因为2025-09-08 20:32:00 UTC+8 等于 2025-09-08 12:32:00 UTC) ``` 示例2:aware datetime对象(时区为UTC+8) ```python # 创建一个aware datetime对象,时区为UTC+8 tz_beijing = pytz.timezone('Asia/Shanghai') aware_date = datetime(2025, 9, 8, 20, 32, 0, tzinfo=tz_beijing) # 转换为时间戳 timestamp = aware_date.timestamp() print(timestamp) # 同样输出:1757345520.0 ``` 示例3:aware datetime对象(时区为UTC) ```python # 创建一个aware datetime对象,时区为UTC tz_utc = pytz.utc aware_date_utc = datetime(2025, 9, 8, 12, 32, 0, tzinfo=tz_utc) timestamp = aware_date_utc.timestamp() print(timestamp) # 同样输出:1757345520.0 ``` 因此,我们可以得出结论:`target_date.timestamp()`返回的是从1970-01-01 00:00:00 UTC到`target_date`所表示的时间点(无论时区如何,只要它代表的是同一个时刻)的秒数。 注意:如果`target_date`是naive且系统时区不是UTC+8,则同一个本地时间(如2025-09-08 20:32:00)得到的时间戳会不同。因此,建议使用aware datetime对象以避免时区混淆。 引用说明: 在JDBC中,`TIMESTAMP`类型通常对应到数据库的日期时间类型,但也会涉及到时区转换(如引用[1]所示)[^1]。另外,在Oracle数据库中,时间戳SCN之间的转换(引用[3])[^3]也体现了时间点与数字之间的映射关系。 §§相关问题§§ 1. 如何将带时区的时间字符串(如`"2025-09-08T20:32:00+08:00"`)转换为Unix时间戳? 2. 在Python中,如何处理不同时区的datetime对象? 3. 在数据库中存储时间戳时,如何处理时区问题? 4. 如何将Unix时间戳转换为特定时区的日期时间字符串? </think> ### `target_date.timestamp()` 返回值解析 在 Python 中,`target_date.timestamp()` 返回的是一个 **浮点数**,表示从 **Unix 纪元(1970-01-01 00:00:00 UTC)** 到 `target_date` 所代表时间的秒数。具体特性如下: #### 1. **返回值本质** - **Unix 时间戳**:标准的 POSIX 时间戳格式 - **浮点数**:包含小数部分表示毫秒/微秒精度 - **数学定义**: $$ \text{时间戳} = \Delta T_{\text{秒}} \quad (\text{Unix 纪元到目标时间的秒数}) $$ #### 2. **计算规则** ```python from datetime import datetime, timezone # 示例:北京时间 2025-09-08 20:32:00 (UTC+8) target_date = datetime(2025, 9, 8, 20, 32, 0, tzinfo=timezone.utc).astimezone(timezone(timedelta(hours=8))) timestamp = target_date.timestamp() # 返回 1757345520.0 ``` #### 3. **时区处理逻辑** | 日期时间类型 | 行为描述 | 返回值示例 (北京时间 2025-09-08 20:32:00) | |--------------------|--------------------------------------------------------------------------|-------------------------------------------| | **无时区 (naive)** | 假设为系统本地时区,转换为 UTC 后计算时间戳 | 依赖系统时区 (UTC+8 返回 1757345520.0) | | **有时区 (aware)** | 直接根据对象时区转换为 UTC 计算时间戳 | 固定返回 1757345520.0 (与 UTC+8 对应) | > **关键点**:同一个物理时间点(无论时区)返回相同时间戳值,如北京时间 2025-09-08 20:32:00 (UTC+8) 与 UTC 时间 2025-09-08 12:32:00 对应相同时间戳 `1757345520.0` #### 4. **数据库关联场景** 在数据库操作中(如引用[1]的 JDBC `TIMESTAMP` 类型)[^1],时间戳常自动转换为 `'YYYY-MM-DD HH24:MI:SS'` 格式字符串存储。Oracle 的转换操作类似引用[3]所示 [^3]: ```sql -- Oracle 时间戳转 SCN (类似概念) SELECT timestamp_to_scn( TO_TIMESTAMP('2025-09-08 20:32:00', 'YYYY-MM-DD HH24:MI:SS') ) FROM dual; ``` #### 5. **注意事项** 1. **时区陷阱**:无时区对象依赖系统环境,跨系统可能不一致 2. **闰秒处理**:标准 Unix 时间戳忽略闰秒 (如 2016-12-31 23:59:60) 3. **精度差异**:Windows 系统通常精度到毫秒,Linux 到微秒
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值