day_18 date、time

date

代表了一个特定的时间,精确到毫秒
在这里插入图片描述
对于Date类 使用的是java.util包下的 Date表示特定的时间。
在这里插入图片描述
时间日期类 Date的标准基准时间是 1970年1月1日00:00:00 GMT起的指定毫秒数。

构造方法

在这里插入图片描述
在这里插入图片描述

基本方法

在这里插入图片描述
在这里插入图片描述

public class DateDemo {
    public static void main(String[] args) {
        // 创建Date对象   返回系统当前时间
        Date date = new Date();
        System.out.println(date);
        //第二种构造方式 public Date(long date)
        long time = date.getTime();//返回当前时间距离1970年1月1日0:0:0的毫秒数
        Date date1 = new Date(time);
        date1.setTime(time + 100000);//重写修改时间
        System.out.println(date1.toString());
        // 比较两个时间对象是否相等  public int compareTo(Date anotherDate)
        //如果参数Date等于此Date,则值为0 ; 如果此日期在Date参数之前,该值小于0 ; 如果此日期在Date参数0则值大于0 。
        System.out.println(date.compareTo(date1));
    }
}

时间日期的格式化

public class SimpleDateFormat   extends DateFormat

SimpleDateFormat是一个具体的类 它允许格式化(日期文本),解析(文本日期)时间日期格式化的模式的表示
在这里插入图片描述

构造方法

在这里插入图片描述

常用方法

在这里插入图片描述
时间日期的格式化 格式化之后返回的是一个String类型

// 进行时间日期的格式化
//创建一个SimpleDateFormat对象  方式一
SimpleDateFormat  sdf = new SimpleDateFormat();
sdf.applyPattern("yyyy-MM-dd HH:mm:ss");
String strDate =  sdf.format(date);
System.out.println(strDate);
//方式二
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String strDate1 = sdf1.format(date);
System.out.println(strDate1);

在这里插入图片描述
将String类型的 日期解析为Date类型

//解析
String dateStr = "2020-12-22 20:05:12";
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd ");
Date date2 = sdf2.parse(dateStr);
System.out.println(date2);

在这里插入图片描述

//解析
String dateStr = "2020-12-22";
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss ");
Date date2 = sdf2.parse(dateStr);
System.out.println(date2);

在这里插入图片描述

封装一个时间日期格式化的工具类

public class DateFormatUtil {
    // 将Date类型转换为String 进行格式化
    public static  String date2Str(Date date){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return sdf.format(date);
    }
    //将String类型转换为Date  解析
    public static Date str2Date(String strDate) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date =  sdf.parse(strDate);
        return  date;
    }
}

Calendar

在这里插入图片描述
没有构造方法,使用 getInstance(); 方法获取一个calendar对象

常用方法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

// 获取Calendar的对象  返回系统当前的日历对象
Calendar calendar = Calendar.getInstance();
System.out.println(calendar);
// 获取年月日时分秒
int year = calendar.get(Calendar.YEAR);
System.out.println(year);
int month =calendar.get(Calendar.MONTH) + 1;
int day = calendar.get(Calendar.DAY_OF_MONTH);
int hour = calendar.get(Calendar.HOUR_OF_DAY);
int min = calendar.get(Calendar.MINUTE);
int sec = calendar.get(Calendar.SECOND);
String str = year +"年"+ month + "月" + day +"日" +" " + hour+":"+min+":"+sec;
System.out.println(str);

修改时间

// 获取 当前日期的后10天的时间
//calendar.add(Calendar.DAY_OF_MONTH,10);
// 获取 当前日期的前10天的时间
calendar.add(Calendar.DAY_OF_MONTH,-10);

在这里插入图片描述

/*
案例:二月天
需求:获取任意一年的二月有多少天
思路:设置时间为当年的3月1号  再来获取3月1号的前一天
 */
public class CalendarDemo2 {
    public static void main(String[] args) {
       int day =   get2MonthLastDay(2052);
        System.out.println(day);
    }
    public  static  int get2MonthLastDay(int year){
        Calendar calendar = Calendar.getInstance();
        //此时设置当前时间为某年的3月1号
        calendar.set(year,2,1);
        // 2月的最后一天就是3月1好的 前一天
        calendar.add(Calendar.DAY_OF_MONTH,-1);
        // 获取年月日时分秒
        int day = calendar.get(Calendar.DAY_OF_MONTH);
        return  day;
    }
}

可变参数

public class VarDemo {
    //计算两个整数的和
    //计算三个整数的和  对于上述两个要求 可以用方法重载解决
    //但是  可能出现对于求和的参数 的个数不确定的情况  可以使用可变参数来解决
    //可变参数的使用和 数组相同
    public static int sum(int a,int ... b){
        for(int i = 0 ; i < b.length;i++){
            a+= b[i];
        }
        return  a;
    }

    public static void main(String[] args) {
        int s= sum(1,2,3,4,5,3);
        System.out.println(s);
    }
}

注意事项

1. 可变参数可单独作为方法的形参;
2. 可变参数必须位于形参列表的最后位置;
3. 在一个方法的形参列表中 可变参数只能有一个;
4. 可变参数的类型可以是任意类型
public static int sum(int c,int d ,int ... b){
    int a = 0 ;
    for(int i = 0 ; i < b.length;i++){
        a+= b[i];
    }
    return  a;
}
public class VarDemo {
    //计算两个整数的和
    //计算三个整数的和  对于上述两个要求 可以用方法重载解决
    //但是  可能出现对于求和的参数 的个数不确定的情况  可以使用可变参数来解决
    //可变参数的使用和 数组相同
    public static int sum(int c,int d ,Object ... b){
        Integer a = 0 ;
        for(int i = 0 ; i < b.length;i++){
            Integer bb = (Integer) b[i];
            a+= bb;
        }
        return  a;
    }

    public static void main(String[] args) {
        int s= sum(1,2,3,4,5,3);
        System.out.println(s);
    }
}
CALL_STATUS call_set_system_date_and_time_send(char *endpoint, char *username, char *password, SYSTEM_DATE_AND_TIME *sys_date_time, void **arg, int *sock, char *created) { struct soap* soap = NULL; struct _tds__SetSystemDateAndTime req; struct tt__Time time; struct tt__Date date; struct tt__TimeZone tz; struct tt__DateTime UTC_date_time; int ret; if(!arg || *arg || !sock || !endpoint || !username || !password || !sys_date_time || strlen(endpoint) == 0) { return CALL_STATUS_ARGS_INVALID; } soap = soap_new(); if(!soap) { return CALL_STATUS_ALLOC_ERROR; } bzero(&time, sizeof(struct tt__Time)); bzero(&date, sizeof(struct tt__Date)); bzero(&UTC_date_time, sizeof(struct tt__DateTime)); bzero(&tz, sizeof(struct tt__TimeZone)); bzero(&req, sizeof(struct _tds__SetSystemDateAndTime)); if (created == NULL) { soap_wsse_add_UsernameTokenDigest(soap, "user", username, password); } else { soap_wsse_add_UsernameTokenDigest2(soap, "user", username, password, created); } time.Hour = sys_date_time->UTC_date_time.hour; time.Minute = sys_date_time->UTC_date_time.minute; time.Second = sys_date_time->UTC_date_time.second; date.Year = sys_date_time->UTC_date_time.year; date.Month = sys_date_time->UTC_date_time.month; date.Day = sys_date_time->UTC_date_time.day; UTC_date_time.Time = &time; UTC_date_time.Date = &date; tz.TZ = sys_date_time->time_zone; req.DateTimeType = sys_date_time->type; req.DaylightSavings = sys_date_time->daylight_savings; req.TimeZone = &tz; req.UTCDateTime = &UTC_date_time; ret = soap_call___tds__SetSystemDateAndTime_send(soap, endpoint, NULL, &req); CHECK_SOAP_CALL_RETURN(ret, soap, TRUE); *arg = soap; *sock = soap->socket; return CALL_STATUS_OK; }这个函数什么作用?
07-03
这个函数 `call_set_system_date_and_time_send` 的作用是 **通过 ONVIF 协议发送设置远程设备系统时间与时区的请求**。它用于向支持 ONVIF 协议的设备(如摄像头、NVR)发送一个 `SetSystemDateAndTime` 请求,以设置该设备的系统时间和时区。 --- ## ✅ 函数功能详解: ### 📦 参数说明: | 参数名 | 类型 | 说明 | |--------|------|------| | `endpoint` | `char*` | ONVIF 设备的服务地址(URL) | | `username` | `char*` | 登录设备的用户名 | | `password` | `char*` | 登录设备的密码 | | `sys_date_time` | `SYSTEM_DATE_AND_TIME*` | 包含要设置的时间和时区信息的结构体 | | `arg` | `void**` | 输出参数,用于保存 SOAP 上下文 | | `sock` | `int*` | 输出参数,用于保存 socket 描述符 | | `created` | `char*` | 可选参数,用于 WS-Security 的时间戳验证 | --- ## 🔧 核心逻辑分析: ```c soap = soap_new(); ``` - 创建一个新的 gSOAP 上下文对象,用于构建和发送 SOAP 请求。 ```c soap_wsse_add_UsernameTokenDigest(...); ``` - 添加基于用户名/密码的身份验证信息到 SOAP 消息中,使用 Digest 摘要认证方式。 ```c time.Hour = sys_date_time->UTC_date_time.hour; ... date.Year = sys_date_time->UTC_date_time.year; ``` - 将用户传入的时间数据填充到 ONVIF 协议所需的 `tt__Time` 和 `tt__Date` 结构中。 ```c tz.TZ = sys_date_time->time_zone; ``` - 设置时区信息(格式如 `"CST-8"` 或 `"UTC+08:00"`)。 ```c req.DateTimeType = sys_date_time->type; req.DaylightSavings = sys_date_time->daylight_savings; req.TimeZone = &tz; req.UTCDateTime = &UTC_date_time; ``` - 构建完整的 `tds__SetSystemDateAndTime` 请求结构体: - `DateTimeType`: 时间类型,如手动设置(Manual)、NTP 同步等 - `DaylightSavings`: 是否启用夏令时 - `TimeZone`: 时区信息 - `UTCDateTime`: UTC 时间 ```c ret = soap_call___tds__SetSystemDateAndTime_send(soap, endpoint, NULL, &req); ``` - 调用 gSOAP 自动生成的函数,将请求发送到指定的 ONVIF 设备。 --- ## 📡 ONVIF `SetSystemDateAndTime` 请求示例(XML 格式) 这是该函数最终发送出去的 SOAP 请求内容的一部分: ```xml <SOAP-ENV:Envelope ...> <SOAP-ENV:Header> <wsse:Security> <wsse:UsernameToken> <wsse:Username>user</wsse:Username> <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">...</wsse:Password> </wsse:UsernameToken> </wsse:Security> </SOAP-ENV:Header> <tds:SetSystemDateAndTime> <tds:DateTimeType>Manual</tds:DateTimeType> <tds:DaylightSavings>true</tds:DaylightSavings> <tds:TimeZone> <tt:TZ>CST-8</tt:TZ> </tds:TimeZone> <tds:UTCDateTime> <tt:Date> <tt:Year>2024</tt:Year> <tt:Month>7</tt:Month> <tt:Day>2</tt:Day> </tt:Date> <tt:Time> <tt:Hour>9</tt:Hour> <tt:Minute>0</tt:Minute> <tt:Second>0</tt:Second> </tt:Time> </tds:UTCDateTime> </tds:SetSystemDateAndTime> </SOAP-ENV:Envelope> ``` --- ## ✅ 总结:这个函数的作用 - **用途**:通过 ONVIF 协议远程设置设备的系统时间与时区。 - **适用场景**:配置 IPC/NVR 等设备的时间同步,确保多个设备之间时间一致。 - **核心操作**: - 使用 gSOAP 构造并发送 `SetSystemDateAndTime` 请求; - 支持身份验证; - 支持设置 UTC 时间、时区、是否启用夏令时等信息。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值