strptime()等效于Windows?

时间:2008-11-26 19:20:48

标签: c++ c windows datetime

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

Open Group description of strptime - 摘要:它将"MM-DD-YYYY HH:MM:SS"等文本字符串转换为tm struct,与strftime()相反。

5 个答案:

答案 0 :(得分:30)

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

  1. 使用sscanf
  2. 解析日期
  3. 然后将整数复制到struct tm(从月份减去1,从年份减去1900 - 月份为0-11,年份从1900年开始)
  4. 最后,使用mktime获取UTC纪元整数
  5. 请记住将isdst的{​​{1}}成员设置为-1,否则您将遇到夏令时问题。

答案 1 :(得分:20)

可以在此处找到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);

答案 2 :(得分:15)

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

#include <time.h>
#include <iomanip>
#include <sstream>

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());
}

请注意,对于跨平台应用程序,在GCC 5.1之前未实现std::get_time,因此切换为直接调用std::get_time可能不是一种选择。

答案 3 :(得分:14)

这就是工作:

#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

答案 4 :(得分:-1)

另一种方法是使用GetSystemTime并将时间信息发送到使用vsnprintf_s根据您的格式解析它的函数。在里面 下面的示例中有一个函数可以创建一个毫秒的时间字符串 精确。然后它将字符串发送到一个函数,该函数根据所需格式对其进行格式化:

#include <string>
#include <cstdio>
#include <cstdarg>
#include <atlstr.h> 

std::string FormatToISO8601 (const std::string FmtS, ...) {
   CStringA BufferString;
   try {
       va_list VaList;
       va_start (VaList, FmtS);
       BufferString.FormatV (FmtS.c_str(), VaList);
   } catch (...) {}
   return std::string (BufferString);
}

void CreateISO8601String () {
   SYSTEMTIME st;
   GetSystemTime(&st);
   std::string MyISO8601String = FormatToISO8601 ("%4u-%02u-%02uT%02u:%02u:%02u.%03u", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
}