C++使用Boost库对时间的操作

news2025/1/10 3:50:40

0x00、获取当前时间,时间格式为yyyy-MM-dd hh:mm:ss.zzz

std::string GetCurrentTime()
{
    // 使用本地时间
    boost::posix_time::ptime now = boost::posix_time::microsec_clock::local_time();

    // 获取毫秒部分
    boost::posix_time::time_duration td = now.time_of_day();
    unsigned int ms = td.total_milliseconds() % 1000; // 获取毫秒部分

    // 创建一个输出格式
    // std::locale loc(std::locale(), new boost::posix_time::time_facet("%Y-%m-%d %H:%M:%S.%f"));
    std::locale loc(std::locale(), new boost::posix_time::time_facet("%Y-%m-%d %H:%M:%S"));

    std::ostringstream oss;
    oss.imbue(loc);
    oss << now << "." << std::setw(3) << std::setfill('0') << ms % 1000;

    return oss.str();
}

0x01、获取当前时间,时间格式为 yyyy/MM/dd hh:mm:ss AM/PM,12小时时间制

std::string GetCurrentTimeFor12HFormat()
{
    boost::posix_time::ptime utc_now = boost::posix_time::second_clock::local_time();
    std::stringstream ss;
    ss.imbue(std::locale(ss.getloc(), new boost::posix_time::time_facet("%Y/%m/%d %I:%M:%S %p")));
    ss << utc_now;

    return ss.str();
}

0x02、获取当前时间,时间格式为 yyyy/MM/dd hh:mm:ss,24小时时间制

std::string GetCurrentTimeFor24HFormat()
{
    boost::posix_time::ptime utc_now = boost::posix_time::second_clock::local_time();
    std::stringstream ss;
    ss.imbue(std::locale(ss.getloc(), new boost::posix_time::time_facet("%Y/%m/%d %H:%M:%S")));
    ss << utc_now;

    return ss.str();
}

0x03、获取当前时间的总秒数

long GetCurrentTimeForSeconds()
{
    // 获取当前的UTC时间
    boost::posix_time::ptime now = boost::posix_time::microsec_clock::universal_time();

    // 计算自1970年1月1日以来的总秒数
    boost::posix_time::ptime epoch(boost::gregorian::date(1970, 1, 1));
    boost::posix_time::time_duration duration_since_epoch = now - epoch;

    // 返回总秒数
    return duration_since_epoch.total_seconds();
}

0x04、完整代码

#include <iostream>
#include <string>
#include <sstream>
#include <locale>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/date_time/time_facet.hpp>
#include <boost/date_time/time_zone_names.hpp>
#include <boost/date_time/gregorian/gregorian.hpp>

using namespace std;

// yyyy-MM-dd hh:mm:ss.zzz
std::string GetCurrentTime()
{
    // 使用本地时间
    boost::posix_time::ptime now = boost::posix_time::microsec_clock::local_time();

    // 获取毫秒部分
    boost::posix_time::time_duration td = now.time_of_day();
    unsigned int ms = td.total_milliseconds() % 1000; // 获取毫秒部分

    // 创建一个输出格式
    // std::locale loc(std::locale(), new boost::posix_time::time_facet("%Y-%m-%d %H:%M:%S.%f"));
    std::locale loc(std::locale(), new boost::posix_time::time_facet("%Y-%m-%d %H:%M:%S"));

    std::ostringstream oss;
    oss.imbue(loc);
    oss << now << "." << std::setw(3) << std::setfill('0') << ms % 1000;

    return oss.str();
}

std::string GetCurrentTimeFor12HFormat()
{
    boost::posix_time::ptime utc_now = boost::posix_time::second_clock::local_time();
    std::stringstream ss;
    ss.imbue(std::locale(ss.getloc(), new boost::posix_time::time_facet("%Y/%m/%d %I:%M:%S %p")));
    ss << utc_now;

    return ss.str();
}

long ConvertFormatTime12HToSeconds(const std::string& datetimeStr)
{
    std::istringstream iss(datetimeStr);
    std::string year, month, day, hour, minute, second, period;

    getline(iss, year, '/');
    getline(iss, month, '/');
    getline(iss, day, ' ');
    getline(iss, hour, ':');
    getline(iss, minute, ':');
    getline(iss, second, ' ');
    getline(iss, period);

    // printf("%s-%s-%s %s:%s:%s %s\n", year.c_str(), month.c_str(), day.c_str(),
    //        hour.c_str(), minute.c_str(), second.c_str(), period.c_str());

    int i_year = std::stoi(year);
    int i_month = std::stoi(month);
    int i_day = std::stoi(day);
    int i_hour = std::stoi(hour);
    int i_minute = std::stoi(minute);
    int i_second = std::stoi(second);
    if(period == "PM")
    {
        i_hour += 12;
    }

    // printf("%d-%d-%d %d:%d:%d\n", i_year, i_month, i_day,
    //        i_hour, i_minute, i_second);

    boost::posix_time::ptime pt(boost::gregorian::date(i_year, i_month, i_day), boost::posix_time::time_duration(i_hour - 8, i_minute, i_second));

    time_t unix_time = boost::posix_time::to_time_t(pt);

    return unix_time;
}

std::string GetCurrentTimeFor24HFormat()
{
    boost::posix_time::ptime utc_now = boost::posix_time::second_clock::local_time();
    std::stringstream ss;
    ss.imbue(std::locale(ss.getloc(), new boost::posix_time::time_facet("%Y/%m/%d %H:%M:%S")));
    ss << utc_now;

    return ss.str();
}

long ConvertFormatTime24HToSeconds(const std::string& datetimeStr)
{
    // 解析日期时间字符串
    boost::posix_time::ptime parsed_time;

    std::istringstream iss(datetimeStr);
    iss.imbue(std::locale(iss.getloc(), new boost::posix_time::time_input_facet("%Y/%m/%d %H:%M:%S")));
    iss >> parsed_time;

    if (iss.fail())
    {
        printf("Failed to parse the date/time string.\n");
        return -1;
    }

    // 获取本地时间相对于UTC的偏移量
    boost::posix_time::ptime local_time = boost::posix_time::second_clock::local_time();
    boost::posix_time::ptime utc_time = boost::posix_time::second_clock::universal_time();
    // 获取偏移量
    boost::posix_time::time_duration timezone_offset = local_time - utc_time;
    // 调整解析出的时间以匹配UTC时间
    parsed_time -= timezone_offset;

    boost::posix_time::time_duration duration_since_epoch = parsed_time - boost::posix_time::ptime(boost::gregorian::date(1970, boost::gregorian::Jan, 1));
    long total_seconds = duration_since_epoch.total_seconds();

    return total_seconds;
}

long GetCurrentTimeForSeconds()
{
    // 获取当前的UTC时间
    boost::posix_time::ptime now = boost::posix_time::microsec_clock::universal_time();

    // 计算自1970年1月1日以来的总秒数
    boost::posix_time::ptime epoch(boost::gregorian::date(1970, 1, 1));
    boost::posix_time::time_duration duration_since_epoch = now - epoch;

    // 返回总秒数
    return duration_since_epoch.total_seconds();
}

std::string FormatTimeForSeconds(long seconds)
{
    boost::posix_time::ptime epoch(boost::gregorian::date(1970, 1, 1));
    boost::posix_time::time_duration td = boost::posix_time::seconds(seconds);;
    boost::posix_time::ptime now = epoch + td;

    // 格式化日期和时间
    std::ostringstream oss;
    oss << now.date().year() << "-"
        << std::setw(2) << std::setfill('0') << now.date().month().as_number() << "-"
        << std::setw(2) << std::setfill('0') << now.date().day().as_number() << " "
        << std::setw(2) << std::setfill('0') << now.time_of_day().hours() + 8 << ":"
        << std::setw(2) << std::setfill('0') << now.time_of_day().minutes() << ":"
        << std::setw(2) << std::setfill('0') << now.time_of_day().seconds();

    return oss.str();
}

long long GetCurrentTimeForMilliSeconds()
{
    // 获取当前的UTC时间
    boost::posix_time::ptime now = boost::posix_time::microsec_clock::universal_time();

    // 计算自1970年1月1日以来的总秒数
    boost::posix_time::ptime epoch(boost::gregorian::date(1970, 1, 1));
    boost::posix_time::time_duration duration_since_epoch = now - epoch;

    // 返回总秒数
    return duration_since_epoch.total_milliseconds();
}

std::string FormatTimeForMilliSeconds(long long milliseconds)
{
    // 创建一个 Boost ptime 对象
    boost::posix_time::ptime epoch(boost::gregorian::date(1970, 1, 1));
    boost::posix_time::time_duration td = boost::posix_time::milliseconds(milliseconds);
    boost::posix_time::ptime now = epoch + td;

    // 格式化日期和时间
    std::ostringstream oss;
    oss << now.date().year() << "-"
        << std::setw(2) << std::setfill('0') << now.date().month().as_number() << "-"
        << std::setw(2) << std::setfill('0') << now.date().day() << " "
        << std::setw(2) << std::setfill('0') << now.time_of_day().hours() + 8  << ":"
        << std::setw(2) << std::setfill('0') << now.time_of_day().minutes() << ":"
        << std::setw(2) << std::setfill('0') << now.time_of_day().seconds() << "."
        << std::setw(3) << std::setfill('0') << (now.time_of_day().fractional_seconds() / 1000);

    return oss.str();
}

int main()
{
    cout << "------------0#--------------" << endl;
    cout << GetCurrentTime() << endl;

    cout << "------------1#--------------" << endl;
    cout << GetCurrentTimeFor12HFormat() << endl;
    cout << GetCurrentTimeFor24HFormat() << endl;
    cout << "--------------------------" << endl;
    cout << ConvertFormatTime12HToSeconds(GetCurrentTimeFor12HFormat()) << endl;
    cout << ConvertFormatTime24HToSeconds(GetCurrentTimeFor24HFormat()) << endl;

    cout << "-------------2#-------------" << endl;
    cout << GetCurrentTimeForSeconds() << endl;
    cout << FormatTimeForSeconds(GetCurrentTimeForSeconds()) << endl;
    cout << "--------------------------" << endl;
    cout << GetCurrentTimeForMilliSeconds() << endl;
    cout << FormatTimeForMilliSeconds(GetCurrentTimeForMilliSeconds()) << endl;

    getchar();
    return 0;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1960121.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】——双链表的实现(赋源码)

双链表的概念和结构 双链表的全称叫做&#xff1a;带头双向循环链表 它的结构示意图如下 注意&#xff1a;这⾥的“带头”跟前⾯我们说的单链表的“头结点”是两个概念&#xff0c;实际前⾯的在单链表阶段称呼不严谨&#xff0c;但是为了读者们更好的理解就直接称为单链表的头…

学习008-02-04-09 Assign a Standard Image(分配标准图像)

Assign a Standard Image&#xff08;分配标准图像&#xff09; This lesson explains how to associate an entity class with a standard image from the DevExpress.Images assembly. This image illustrates the entity class in the following sections of the UI: 本课介…

C# Unity 面向对象补全计划 之 访问修饰符

本文仅作学习笔记与交流&#xff0c;不作任何商业用途&#xff0c;作者能力有限&#xff0c;如有不足还请斧正 本系列旨在通过补全学习之后&#xff0c;给出任意类图都能实现并做到逻辑上严丝合缝

LabVIEW安装DSC模块 转自三景页593

打开NI Package Manager&#xff0c;找到LabVIEW and Drivers 找到自己需要的版本进行下载 搜索需要的模块进行下载 以DSC模块为例&#xff0c;下载右边的安装即可 最后用激活工具激活即可使用

【AI大模型】:结合wxauto实现智能微信聊天机器人

文章目录 &#x1f9d0;一、wxauto简介&#x1f3af;二、wxauto的主要功能&#x1f4e6;三、wxauto的安装与使用1. wxauto的安装2. wxauto的简单使用3. wxauto的消息对象 &#x1f4bb;四、wxauto结合大模型实现简单的聊天机器人三、完整代码 &#x1f9d0;一、wxauto简介 wxa…

(day28)leecode——有效括号

描述 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;["((()))","(()())","(())()","()(())","…

视频转场SDK,高效集成,提升视频制作效率

传统的视频制作方式往往受限于单一的转场效果&#xff0c;难以在瞬息万变的市场中脱颖而出。美摄科技&#xff0c;作为视频处理技术的领航者&#xff0c;以其革命性的视频转场SDK&#xff0c;为企业视频创作带来了前所未有的创意与效率飞跃。 重塑转场艺术&#xff0c;激发创意…

el-table 表格列宽自适应

思路&#xff1a;获取当前列的最长数据和表头名称比较&#xff0c;取大值赋值给宽度。 效果图 自适应前 自适应后 自适应方法 // col 里面包含了表头字段和名称&#xff0c;list 是表格数据 columnWidth(col, list) {let prop col.prop, lab col.lab;let width 90; // 设…

数据结构——双向链表及其总结

1.概述 链表根据是否带头、是否双向、是否循环可以分为八种&#xff0c;双向链表是典型的带头双向循环链表。 双向链表的结构可以表示为下&#xff1a; struct ListNode {int data;struct ListNode* next;struct ListNode* prev; } 2.双向链表的实现过程及其解析 双向链表…

Redis 内存淘汰策略

Redis 作为一个内存数据库&#xff0c;必须在内存使用达到配置的上限时采取策略来处理新数据的写入需求。Redis 提供了多种内存淘汰策略&#xff08;Eviction Policies&#xff09;&#xff0c;以决定在内存达到上限时应该移除哪些数据。

如何理解Java的内存模型

希望文章能给到你启发和灵感~ 如果觉得文章对你有帮助的话,点赞 + 关注+ 收藏 支持一下博主吧~ 阅读指南 开篇说明一、内存相关基础了解1.1 硬件的内存架构1.2 缓存一致性问题1.3 内存模型的出现二、Java内存模型2.1 组成部分2.2 模型特性2.4 As-if-serial语义与Happens-bef…

【2024蓝桥杯/C++/B组/前缀总分】

题目 代码 #include<bits/stdc.h> using namespace std;// 定义常量N为210&#xff0c;用于数组的大小 const int N 210; // 声明n为整型变量&#xff0c;用于存储字符串的数量 int n; // 声明一个字符串数组str&#xff0c;大小为N&#xff0c;用于存储字符串 string …

pda条码扫描手持机,数据采集器助力景区售检票

随着科技的发展&#xff0c;景区也在往信息化方向发展&#xff0c;景区为了提升售票、检票入园效率&#xff0c;可采用pda条码扫描手持机售检票系统。pda条码扫描手持机是一种便携式的检票设备&#xff0c;可以随时随地使用。配备5.5寸高清大屏,1440*720分辩率&#xff0c;多点…

安防监控视频融合汇聚平台EasyCVR创建新用户时没有摄像机权限,是什么原因?

国标GB28181/RTSP/ONVIF视频管理系统EasyCVR视频汇聚平台&#xff0c;是一个具备高度集成化、智能化的多协议接入视频监控汇聚管理平台&#xff0c;拥有远程视频监控、录像、云存储、录像检索与回放、语音对讲、云台控制、告警、平台级联等多项核心功能。EasyCVR安防监控视频系…

docker笔记5-数据卷

docker笔记5-数据卷 一、数据卷1.1 定义1.2 本质1.3 特点 二、使用数据卷三、案例2.1 安装Mysql 四、匿名挂载和具名挂载4.1 匿名挂载4.2 具名挂载 五、三种挂载方式 一、数据卷 1.1 定义 Docker 容器数据卷是一个可用于存储数据的特殊目录&#xff0c;存在于一个或多个容器的…

免费【2024】springboot 出租车管理网站的设计与实现

博主介绍&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

unity2D游戏开发15自我防御

创建子弹 Ammo类来表示自子弹 创建一个GameObject,并命名为AmmoObject 将Ammo.png拖入Object中 属性设置,点击apply 将SpriteRenderer组件添加到AmmoObject,将Sorting Layer设置为Characters,并将Sprite属性设置为Ammo 将CircleCollider2D添加到AmmoObject。确保选中Is Tr…

【C++高阶】哈希的应用(封装unordered_map和unordered_set)

✨ 世事漫随流水&#xff0c;算来一生浮梦 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;C学习 &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&…

KubeSphere部署:(三)MySQL安装

MySQL没有什么特殊的&#xff0c;这里记录一下部署过程(本文示例中安装的版本为5.7.29)。步骤大致如下&#xff1a; 拉取docker镜像 -> 标记并推送至私有harbor -> 创建有状态负载 -> 创建服务 一、拉取镜像&#xff0c;并推送至私有harbor # 拉取镜像 docker pull …

PP氮气柜的特点和使用事项介绍

PP材质&#xff0c;全称为聚丙烯&#xff0c;是一种热塑性塑料&#xff0c;具有质轻、强度高、耐化学腐蚀性好、无毒无味、耐热性佳等优点。它在众多塑料材料中脱颖而出&#xff0c;特别是在需要耐腐蚀和长期使用的应用中&#xff0c;表现尤为出色。 PP材质具有优秀的化学稳定性…