当前位置:  开发笔记 > 编程语言 > 正文

strptime()等效于Windows?

如何解决《strptime()等效于Windows?》经验,为你挑选了4个好方法。

是否有strptime()适用于Windows的等效实现?不幸的是,这个POSIX功能似乎不可用.

打开strptime的组描述 - 摘要:它将文本字符串转换"MM-DD-YYYY HH:MM:SS"为a tm struct,与之相反strftime().



1> amwinter..:

如果您不想移植任何代码或谴责您的项目提升,您可以这样做:

    使用解析日期 sscanf

    然后将整数复制到a中struct tm(从月份减去1,从年份减去1900 - 月份为0-11,年份从1900年开始)

    最后,用于mktime获取UTC纪元整数

只需记住将isdst成员设置struct tm为-1,否则您将遇到夏令时问题.


请注意,`mktime`适用于1970~2038范围内的日期,但您可以使用[`_mktime64`](http://msdn.microsoft.com/en-us/library/d1y53h2a%28v=vs.80% 29.aspx)适用于1970~3000范围内的日期:)

2> Adam Rosenfi..:

strptime()可在此处找到开源版本(BSD许可证):http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/time/strptime.c?rev=HEAD

您需要添加以下声明才能使用它:

char *strptime(const char * __restrict, const char * __restrict, struct tm * __restrict);



3> Orvid King..:

假设您使用的是Visual Studio 2015或更高版本,则可以将其用作strptime的替代品:

#include 
#include 
#include 

extern "C" char* strptime(const char* s,
                          const char* f,
                          struct tm* tm) {
  // Isn't the C++ standard lib nice? std::get_time is defined such that its
  // format parameters are the exact same as strptime. Of course, we have to
  // create a string stream first, and imbue it with the current C locale, and
  // we also have to make sure we return the right things if it fails, or
  // if it succeeds, but this is still far simpler an implementation than any
  // of the versions in any of the C standard libraries.
  std::istringstream input(s);
  input.imbue(std::locale(setlocale(LC_ALL, nullptr)));
  input >> std::get_time(tm, f);
  if (input.fail()) {
    return nullptr;
  }
  return (char*)(s + input.tellg());
}

请注意,对于跨平台应用程序,std::get_time直到GCC 5.1才实现,因此切换到std::get_time直接调用可能不是一种选择.



4> ravenspoint..:

这样做的工作:

#include "stdafx.h"
#include "boost/date_time/posix_time/posix_time.hpp"
using namespace boost::posix_time;

int _tmain(int argc, _TCHAR* argv[])
{
    std::string ts("2002-01-20 23:59:59.000");
    ptime t(time_from_string(ts));
    tm pt_tm = to_tm( t );

但请注意,输入字符串为YYYY-MM-DD


+1用于指出跨平台解决方案.
推荐阅读
135369一生真爱_890
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有