最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C/C++標準庫之轉換UTC時間到local本地時間詳解

 更新時間:2017年11月22日 08:39:18   作者:infoworld  
最近遇到一個問題:數據庫中存放的時間為UTC時間,但是現在要求都出來顯示的時間為本地時間,所以就用C++實現了,下面這篇文章主要給大家介紹了關于C/C++標準庫之轉換UTC時間到local本地時間的方法,還有C++中獲取UTC時間精確到微秒的實現代碼,需要的朋友可以參考下。

前言

UTC 時間DateTime.UtcNow 和 系統(tǒng)本地時間 DateTime.Now 相差8個時區(qū) ,美國本地時間和北京時間相差15個時區(qū): 美國,而一般使用UTC時間方便統(tǒng)一各地區(qū)時間差異。

場景

      1.如果有面向全球用戶的網站, 一般在存儲時間數據時存儲的是UTC格式的時間, 這樣時間是統(tǒng)一的, 并可以根據當地時區(qū)來進行準確的轉換.

      2.存儲本地時間的問題就在于如果換了時區(qū), 那么顯示的時間并不正確. 所以我們存儲時間時最好還是存儲UTC時間,便于正確的轉換.

說明

1.C/C++標準庫提供了標準函數可以轉換, 不需要借助Win32 API.

例子

// test_datetime_format.cpp : 定義控制臺應用程序的入口點。
//

#include "stdafx.h"
#include <time.h>
#include <sstream>
#include <iostream>
#include <assert.h>

//2014-09-13T10:52:36Z
//2014-09-13 10:52:36
char* ConvertUtcToLocalTime(struct tm* t2,const char* date){

 struct tm t;
 memset(&t,0,sizeof(t));
 t.tm_year = atoi(date)-1900;
 t.tm_mon = atoi(date+5)-1;
 t.tm_mday = atoi(date+8);
 t.tm_hour = atoi(date+11);
 t.tm_min = atoi(date+14);
 t.tm_sec = atoi(date+17);

 time_t tt = _mkgmtime64(&t);
 if(tt != -1){
 if(t2 == NULL){
  t2 = &t; 
 }
 *t2 = *localtime(&tt);
 char* ds = (char*) malloc(24);
 memset(ds, 0, 24);
 sprintf(ds, "%.4d-%.2d-%.2d %.2d:%.2d:%.2d", t2->tm_year + 1900,
  t2->tm_mon + 1, t2->tm_mday, t2->tm_hour, t2->tm_min,
  t2->tm_sec);
 return ds;
 }
 return NULL;
}


//https://www.w3.org/TR/NOTE-datetime
//https://msdn.microsoft.com/en-us/library/2093ets1.aspx
//2014-09-13T10:52:36Z
int _tmain(int argc, _TCHAR* argv[])
{
 const char* kTime = "2014-09-13 18:52:36";
 std::cout << "Source DateTime: " << "2014-09-13T10:52:36Z" << std::endl;
 auto t = ConvertUtcToLocalTime(NULL,"2014-09-13T10:52:36Z");
 std::cout << "Dest DateTime: " << t << std::endl;
 assert(!strcmp(t,kTime));

 t = ConvertUtcToLocalTime(NULL,"2014-09-13 10:52:36");
 std::cout << t << std::endl;
 assert(!strcmp(t,kTime));

 struct tm tt;
 t = ConvertUtcToLocalTime(&tt,"2014-09-13 10:52:36");
 std::cout << t << std::endl;
 assert(!strcmp(t,kTime));
 assert(tt.tm_year == (2014-1900));
 assert(tt.tm_mon == 9-1);
 assert(tt.tm_mday == 13);
 assert(tt.tm_hour == 18);
 assert(tt.tm_min == 52);
 assert(tt.tm_sec == 36);

 return 0;
}


}

輸出

Source DateTime: 2014-09-13T10:52:36Z
Dest DateTime: 2014-09-13 18:52:36
2014-09-13 18:52:36
2014-09-13 18:52:36

C++中獲取UTC時間精確到微秒的實現代碼

在日常開發(fā)過程中經常會使用到時間類函數的統(tǒng)計,其中獲取1970年至今的UTC時間是比較常使用的,但是在windows下沒有直接能夠精確到微妙級的函數可用。本文提供方法正好可以解決這類需求問題。

下面先給出C++實現代碼:

代碼如下:

#ifndef UTC_TIME_STAMP_H_
#define UTC_TIME_STAMP_H_

#include <windows.h>
#include <sys/timeb.h>
#include <time.h> 

#if !defined(_WINSOCK2API_) && !defined(_WINSOCKAPI_)
struct timeval
{
long tv_sec;
long tv_usec;
};
#endif

static int gettimeofday(struct timeval* tv)
{
 union {
    long long ns100;
    FILETIME ft;
 } now;
 GetSystemTimeAsFileTime (&now.ft);
 tv->tv_usec = (long) ((now.ns100 / 10LL) % 1000000LL);
 tv->tv_sec = (long) ((now.ns100 - 116444736000000000LL) / 10000000LL);

 return (0);
}
//獲取1970年至今UTC的微妙數
static time_t TimeConversion::GetUtcCaressing()
{
 timeval tv;
 gettimeofday(&tv); 
 return ((time_t)tv.tv_sec*(time_t)1000000+tv.tv_usec);
}
#endif

接下來給出使用方法:

timeval tv;
gettimeofday(&tv); 

或者直接調用:GetUtcCaressing();

UTC時間秒級UTC獲取方法代碼:

time_t timep;
struct tm *p;
time(&timep);
p=localtime(&timep);
timep = mktime(p);
printf("%d\n",timep); 

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

參考

相關文章

  • c++將字符串轉數字的實例方法

    c++將字符串轉數字的實例方法

    在本篇文章里小編給大家整理的是關于c++將字符串轉數字的實例方法,有需要的朋友們可以參考下。
    2020-02-02
  • C++線程間的互斥和通信場景分析

    C++線程間的互斥和通信場景分析

    很多朋友對C++線程間的互斥和通信知識掌握不是多牢靠,今天小編通過模擬車站賣票應用場景給大家詳細解析C++線程間的互斥和通信知識,感興趣的朋友跟隨小編一起看看吧
    2021-05-05
  • C語言實現貪吃蛇代碼

    C語言實現貪吃蛇代碼

    這篇文章主要為大家詳細介紹了C語言實現貪吃蛇代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • QT實現C++數據類與json轉換

    QT實現C++數據類與json轉換

    這篇文章主要為大家詳細介紹了如何使用QT實現C++數據類與json轉換,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2025-04-04
  • C語言中數據結構之鏈式基數排序

    C語言中數據結構之鏈式基數排序

    這篇文章主要介紹了C語言中數據結構之鏈式基數排序的相關資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • C語言實現2048游戲

    C語言實現2048游戲

    這篇文章主要為大家詳細介紹了C語言實現2048小游戲,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • C語言實現在控制臺打印余弦曲線

    C語言實現在控制臺打印余弦曲線

    余弦曲線又叫余弦波(cosinwave),是一種來自數學三角函數中的余弦比例的曲線。這篇文章主要為大家介紹了如何在控制臺繪制余弦曲線,感興趣的可以了解一下
    2023-02-02
  • C++獲取數組大小和多維數組操作詳解

    C++獲取數組大小和多維數組操作詳解

    這篇文章主要介紹了C++獲取數組大小和多維數組的操作,文中通過代碼示例介紹的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2024-04-04
  • VSCode Linux的C++代碼格式化配置的實現

    VSCode Linux的C++代碼格式化配置的實現

    動格式化代碼容易出現錯誤,特別是當代碼量較大時,使用自動格式化可以減少這種錯誤的風險,本文主要介紹了VSCode Linux的C++代碼格式化配置的實現,感興趣的可以了解一下
    2023-10-10
  • C++ Boost命令行解析庫的應用詳解

    C++ Boost命令行解析庫的應用詳解

    命令行解析庫是一種用于簡化處理命令行參數的工具,它可以幫助開發(fā)者更方便地解析命令行參數并提供適當的幫助信息,本文主要介紹了不同的命令行解析庫和它們在C++項目中的應用,希望對大家有所幫助
    2023-11-11

最新評論

玉溪市| 双鸭山市| 栖霞市| 孝感市| 岑巩县| 云梦县| 上思县| 永昌县| 青州市| 合肥市| 勐海县| 蚌埠市| 石城县| 华容县| 余江县| 改则县| 龙陵县| 儋州市| 漠河县| 丰台区| 屯留县| 若羌县| 宝鸡市| 无为县| 黑河市| 墨玉县| 勐海县| 克山县| 葵青区| 桑植县| 高清| 南木林县| 施甸县| 嵊泗县| 平乐县| 微博| 上思县| 温宿县| 松阳县| 镇安县| 鄢陵县|