如何从字符串中解析日期/时间?

2023-11-21

Input:带有日期和可选时间的字符串。不同的表现形式固然很好,但也是必要的。这些字符串是用户提供的,并且可能格式错误。例子:

  • "2004-03-21 12:45:33"(我认为这是默认布局)
  • "2004/03/21 12:45:33"(可选布局)
  • "23.09.2004 04:12:21"(德语格式,可选)
  • "2003-02-11"(时间可能会缺失)

所需输出:自纪元 (1970/01/01 00:00:00) 或其他固定点以来的秒数。

Bonus:另外,读取本地系统时间的 UTC 偏移量会很棒。

假定输入是相关机器上的本地时间。 输出需要是 UTC。系统仅限 Linux(需要 Debian Lenny 和 Ubuntu)。

我尝试过使用boost/date_time,但必须承认我无法理解文档。以下操作不需要从系统本地时间到 UTC 的转换:

std::string date = "2000-01-01";
boost::posix_time::ptime ptimedate = boost::posix_time::time_from_string(date);
ptimedate += boost::posix_time::hours(Hardcoded_UTC_Offset);// where to get from?
struct tm = boost::posix_time::to_tm(ptimedate);
int64_t ticks = mktime(&mTmTime);

I think boost::date_time可以提供所需的 UTC 偏移量,但我不知道如何提供。


虽然我不知道如何格式化boost中输入的个位数月份,但在两位数编辑后我可以做到:

#include <iostream>
#include <boost/date_time.hpp>
namespace bt = boost::posix_time;
const std::locale formats[] = {
std::locale(std::locale::classic(),new bt::time_input_facet("%Y-%m-%d %H:%M:%S")),
std::locale(std::locale::classic(),new bt::time_input_facet("%Y/%m/%d %H:%M:%S")),
std::locale(std::locale::classic(),new bt::time_input_facet("%d.%m.%Y %H:%M:%S")),
std::locale(std::locale::classic(),new bt::time_input_facet("%Y-%m-%d"))};
const size_t formats_n = sizeof(formats)/sizeof(formats[0]);

std::time_t pt_to_time_t(const bt::ptime& pt)
{
    bt::ptime timet_start(boost::gregorian::date(1970,1,1));
    bt::time_duration diff = pt - timet_start;
    return diff.ticks()/bt::time_duration::rep_type::ticks_per_second;

}
void seconds_from_epoch(const std::string& s)
{
    bt::ptime pt;
    for(size_t i=0; i<formats_n; ++i)
    {
        std::istringstream is(s);
        is.imbue(formats[i]);
        is >> pt;
        if(pt != bt::ptime()) break;
    }
    std::cout << " ptime is " << pt << '\n';
    std::cout << " seconds from epoch are " << pt_to_time_t(pt) << '\n';
}
int main()
{
    seconds_from_epoch("2004-03-21 12:45:33");
    seconds_from_epoch("2004/03/21 12:45:33");
    seconds_from_epoch("23.09.2004 04:12:21");
    seconds_from_epoch("2003-02-11");
}

请注意,秒数纪元输出将假设日期采用 UTC:

~ $ ./test | head -2
ptime is 2004-Mar-21 12:45:33
seconds from epoch are 1079873133
~ $ date -d @1079873133
Sun Mar 21 07:45:33 EST 2004

你可能可以使用boost::posix_time::c_time::localtime() from #include <boost/date_time/c_time.hpp>假设输入位于当前时区,完成此转换,但它相当不一致:例如,对我来说,今天和下个月夏令时结束时的结果会有所不同。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从字符串中解析日期/时间? 的相关文章

随机推荐

  • 输入尺寸与宽度

  • 定义条件路由

    我一直在寻找类似的东西 但没有运气 我想构建一个对相同网址使用不同控制器的应用程序 基本思想是 如果用户以管理员身份登录 他使用管理员控制器 如果用户只是用户 他使用用户控制器 这只是一个例子 基本上我想要一个函数来决定控制器路由采用什么
  • 是否有用于字符串自然排序的内置函数?

    我有一个字符串列表 我想对其执行自然字母排序 例如 以下列表是自然排序的 我想要的 elm0 elm1 Elm2 elm9 elm10 Elm11 Elm12 elm13 这是上面列表的 排序 版本 我使用的sorted Elm11 Elm
  • 我在 jQuery 中看到过这个 它有什么作用
  • iPhone X 上的 TableView 和 home 指示器

    我正在使用两者UITableViewController and UITableView在一个项目中 An UITableView in an UITableViewController覆盖 iPhone X 上的主页指示器 但是一个UIT
  • VIM:在 python 模式下使用 python3 解释器

    我最近切换到 vim 并将其配置为使用 Python 编程this教程 之前 我已经确保 vim 支持 python3 vim version 显示 python dyn 和 python3 dyn 使用this文章 但是当执行文件时pyt
  • 如何通过指定alpha混合量来计算RGB颜色?

    我正在编写一个颜色选择器 它可以从您指向屏幕上的任何位置获取像素 RGB 值 我还希望可以选择指定我选择的颜色已经具有 alpha 值 我只是想知道如何计算结果颜色 例如 生成的像素颜色为 240 247 249 但我知道原始颜色具有 10
  • 滚动角载荷数据 [For 循环]

    我正在显示与搜索词相关的数据 该数据一次性显示所有结果 我想要做的是一次显示 6 个数据 然后将剩余的数据加载到滚动条上 li category name li 如何滚动显示数据 你可以听window scroll当滚动到达页面底部时发生事
  • 从 Jenkinsfile 中的函数调用阶段

    我的 Jenkinsfile 中有 def foo 1 2 3 def parallelStagesFromMap foo collectEntries Build it generateStage it def generateStage
  • 如何正确模拟类的私有成员

    我正在尝试为依赖于另一个私有方法的方法编写一些单元测试 如下例所示 def is member of self group name members self get group members group name 我想模拟的私有方法是
  • 使用自定义证书文件在代理后面进行 Pip

    pip 的代理设置可以通过 proxy命令行选项或全局配置文件中 即 HOME config pip pip conf在Unix中 HOME Library Application Support pip pip conf在 OS X 中
  • 背景颜色十六进制到 JavaScript 变量

    我对 JavaScript 和 jQuery 有点陌生 现在我面临一个问题 我需要将一些数据发布到 PHP 其中一位数据需要是 div X 的背景颜色十六进制 jQuery 具有 css background color 函数 使用它我可以
  • 嵌套 ng-bootstrap 选项卡 (Angular 2)

    我正在尝试嵌套 ng bootstrap 选项卡小部件 但嵌套选项卡的内容未正确显示 当我单击嵌套选项卡时 内容本身就会消失 最小演示 我究竟做错了什么 这是查看代码
  • 在 WPF 中实现多停靠窗口系统(如 Blend、Visual Studio)

    您将如何实现如 Expression Blend 中所示的停靠工具箱窗口系统 您可以通过多种方式相互停靠工具箱窗口 如选项卡或浮动顶级窗口一样重叠 我的系统的行为应该与 Expression Blend 中的行为几乎相同 另外 我在拖动时获
  • cv2.drawContours不会绘制填充轮廓

    我正在尝试使用显示填充轮廓cv2 drawContoursOpenCV 中的函数 我已经从边缘图像中开发了一个轮廓列表 该边缘图像源自Canny检测 并找到轮廓RETR EXTERNAL为层次结构定义启用 然而我遇到了一个问题 尽管使用 1
  • 使用指向结构内部声明的字段的指针(也称为 CONTAINING_RECORD 宏)来计算指向整个结构的指针的可移植方法

    例如 在 Winnt h 中定义了众所周知的 CONTAINING RECORD 宏 define CONTAINING RECORD address type field type PCHAR address ULONG PTR type
  • 如何覆盖 Next.js `*.svg` 模块声明?

    Next js 最近进行了修改 在 v11 0 x 中 其中具有以下类型定义 In next env d ts 不可修改 在每次构建时重新生成
  • activeadmin,删除空消息

    在 ActiveAdmin 中 当模型没有项目 在我的示例用户中 时 它会显示默认的 还没有用户 创建一个 我怎样才能删除这条消息 是否可以在每个页面上进行自定义 即为特定的 ActiveAdmin 页面提供特定的消息 这是一个猴子补丁 在
  • 从组件中的 useState 多次调用状态更新程序会导致多次重新渲染

    我第一次尝试 React hooks 一切看起来都很好 直到我意识到当我获取数据并更新两个不同的状态变量 数据和加载标志 时 我的组件 数据表 被渲染两次 即使两次调用状态更新器发生在同一函数中 这是我的 api 函数 它将两个变量返回到我
  • 如何从字符串中解析日期/时间?

    Input 带有日期和可选时间的字符串 不同的表现形式固然很好 但也是必要的 这些字符串是用户提供的 并且可能格式错误 例子 2004 03 21 12 45 33 我认为这是默认布局 2004 03 21 12 45 33 可选布局 23