风云it界

代码改变世界,软件横行网络

   :: 首页 :: 联系 ::  :: 管理

公告

个人简介: 小吴,据说酷爱软件,爱网络,爱游戏,爱数码,爱科技,各种控,各种宅……

常用链接

最新评论

阅读排行榜

评论排行榜

#

我们在用c++编写程序的时候,有时候需要设置一下时区,那么用c++如何实现呢?
一、获取当前系统时区信息
    使用API函数GetTimeZoneInformation可以获得当前时区的相关信息,函数原型为
    DWORD GetTimeZoneInformation(
    LPTIME_ZONE_INFORMATION lpTimeZoneInformation);
    需要传递一个TIME_ZONE_INFORMATION 结构体指针,此结构体定义为
    typedef struct _TIME_ZONE_INFORMATION {
    LONG Bias;//以分钟为单位
    WCHAR StandardName[ 32 ];//标准时间的名称
    SYSTEMTIME StandardDate;
    LONG StandardBias;
    WCHAR DaylightName[ 32 ];//夏令时的名称
    SYSTEMTIME DaylightDate;
    LONG DaylightBias;
    } TIME_ZONE_INFORMATION, *PTIME_ZONE_INFORMATION, *LPTIME_ZONE_INFORMATION;
    其中UTC = local time + bias(UTC时间 = 本地时间 + bias),具体含义参看MSDN
    例子:
    CString GetTimeZoneNow()
    {
    TIME_ZONE_INFORMATION tzi;
    GetSystemTime(
    GetTimeZoneInformation(
    CString   strStandName   =   tzi.StandardName;
    CString   strDaylightName   =   tzi.DaylightName;
    int zone = tzi.Bias/ -60; //时区,如果是中国标准时间则得到8
    return strStandName;
    }
    二、设置时区
    可以使用API函数SetTimeZoneInformation设置时区,函数原型为
    BOOL SetTimeZoneInformation(
    const TIME_ZONE_INFORMATION* lpTimeZoneInformation
    );
    同样需要TIME_ZONE_INFORMATION结构体,不过这是设置时区,所以我们要为这个结构体设置相应的值,我们可以在注册表
    HKEY_LOCAL_MACHINE"SOFTWARE"Microsoft"Windows NT"CurrentVersion"Time Zones
    下得到所有的时区信息,(如果不想每次都查注册表获得时区列表,可以讲时区列表保存至XML或其他文件中)
    以中国北京时间为例即 China Standard Time子项,
    Display:在控制面板中调整时区时显示的名称
    Std:标准时间名称
    Dlt: 如果有夏令时时区则为其名称。
    Tzi: 一个数据结构,包含本地时区和0时区相差的分钟数等信息。二进制形式存储的
    用一结构体定义之
    typedef struct _REG_TZI_FORMAT
    {
    LONG Bias;
    LONG StandardBias;
    LONG DaylightBias;
    SYSTEMTIME StandardDate;
    SYSTEMTIME DaylightDate;
    } REG_TZI_FORMAT;
    例子:(上面的结构体定义不要忘记加入代码)
    BOOL CSetTimeZone(CString subKey)
    {
    //获得权限
    HANDLE hToken;
    TOKEN_PRIVILEGES tkp;
    OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,
    LookupPrivilegeValue(NULL, TEXT("SeTimeZonePrivilege"),
    tkp.PrivilegeCount = 1;
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    AdjustTokenPrivileges(hToken, FALSE,  0, (PTOKEN_PRIVILEGES)NULL, 0);
    HKEY hKey;
    TIME_ZONE_INFORMATION tziNew;
    REG_TZI_FORMAT regTZI;
    DWORD dwBufLen=sizeof(regTZI);
    LONG lRet;
    CString keyName = _T("Software""Microsoft""Windows NT""CurrentVersion""Time Zones""")+ subKey;
    CString strStd = _T("");//标准时间名称
    CString strDlt = _T("");//夏令时名称
    unsigned char szData[256];
    DWORD dwDataType, dwBufSize;
    dwBufSize = 256;
    lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE,keyName,    0, KEY_QUERY_VALUE,  );
    if( lRet != ERROR_SUCCESS )
    return FALSE;
    lRet = RegQueryValueEx( hKey, TEXT("TZI"), NULL, NULL,(LPBYTE)
    if(RegQueryValueEx(hKey, _T("Dlt"), 0,  szData,  == ERROR_SUCCESS)
    strDlt =(LPCTSTR)szData;
    dwBufSize = 256;
    if(RegQueryValueEx(hKey, _T("Std"), 0,  szData,  == ERROR_SUCCESS)
    strStd =(LPCTSTR)szData;
    RegCloseKey(hKey);
    if( (lRet != ERROR_SUCCESS) || (dwBufLen > sizeof(regTZI)) )
    return FALSE;
    //设置值
    ZeroMemory(sizeof(tziNew));
    tziNew.Bias = regTZI.Bias;
    tziNew.StandardDate = regTZI.StandardDate;
    wcscpy(tziNew.StandardName, strStd);
    wcscpy(tziNew.DaylightName, strDlt);
    tziNew.DaylightDate = regTZI.DaylightDate;
    tziNew.DaylightBias = regTZI.DaylightBias;
    if( !SetTimeZoneInformation(  ) )
    {
    TRACE("Failure1: %d"n", GetLastError());
    return FALSE;
    }
    tkp.Privileges[0].Attributes = 0;
    AdjustTokenPrivileges(hToken, FALSE,  0, (PTOKEN_PRIVILEGES) NULL, 0);
    return TRUE;
    }
    调用说明:如果要设置成(GMT+05:00)叶卡捷琳堡
    则为 CSetTimeZone(_T(“Ekaterinburg Standard Time”));

以上即为用c++获取以及设置时区的方法,仅是个人在网上搜索而来,如果有不同意见的方法,欢迎留言交流,共同学习c++编程语言!
posted @ 2013-12-17 17:03 吴奇 阅读(3286) | 评论 (0)编辑 收藏

原来C语言也有类似java的split的函数,按特定字符串对字符串进行分解:
    
    strtok的解释和示例:
    
    strtok
    
    Syntax:
    
    view plain
    
    <span style="font-size:16px;">#include <cstring> char *strtok( char *str1, const char *str2 );</span>
    
    The strtok() function returns a pointer to the next "token" in str1, where str2 contains the delimiters that determine the token. strtok() returns NULL if no token is found. In order to convert a string to tokens, the first call to strtok() should have str1 point to the string to be tokenized. All calls after this should have str1 be NULL.
    
    For example:
    
    view plain
    
    <span style="font-size:16px;"></span><pre name="code" class="cpp">    char str[] = "now # is the time for all # good men to come to the # aid of their country";
    
    char delims[] = "#";
    
    char *result = NULL;
    
    result = strtok( str, delims );
    
    while( result != NULL ){
    
    printf( "result is \"%s\"\n", result );
    
    result = strtok( NULL, delims );
    
    }
    
    The above code will display the following output:
    
    view plain
    
    <span style="font-size:16px;">result is "now "
    
    result is " is the time for all "
    
    result is " good men to come to the "
    
    result is " aid of their country" </span>
    
    在s中找出以ct中的字符为分隔的字符串,即是源串中除去了含有分隔串中的所有字符后余下的一段段的字符串,每调用一次找到一串,找不到则返回空串。第一次调用必须传给它有效的字符串,第二次传NULL就可以了,每次调用返回找到的子串的时候都会把源串中该子串的尾部字符(原来是搜索串中的某一字符)修改成'/0'字符返回值为每次调用得到的字串。
    
    但是百度百科里面又有提到说“最新的Linux内核2.6.29,说明了这个函数已经不再使用,由速度更快的strsep()代替”。所以又去查了下strsep函数:
    
    原型:char *strsep(char **stringp, const char *delim);
    
    功能:分解字符串为一组字符串。从stringp指向的位置起向后扫描,遇到delim指向位置的字符后,将此字符替换为NULL,返回stringp指向的地址。
    
    但是strsep函数,在 Windows是没有支持的,我是在Linux环境,所以ok~
    
    给个例子:
    
    view plain
    
    char str2[] = "2011/11/28";
    
    char *buf;
    
    char *token;
    
    buf = str2;
    
    while((token = strsep(&buf, "/")) != NULL){
    
    printf("%s\n", token);
    
    }
    
    输出:
    
    view plain
    
    2011
    
    11
    
    28

      上面只是自己的一个感想而已,如有不同意见,希望交流,回复交流,共同学习c++语言!
posted @ 2013-12-17 16:56 吴奇 阅读(968) | 评论 (0)编辑 收藏

    估计大部分去过九寨沟的朋友都有一种欣然开阔的感觉,的确,九寨沟的美景是真正的童话一般。有种天然的仙境的称号,仅此只可以这么称呼他。九寨沟究竟四季都是什么样的?
九寨沟的春天:
  气温较低且变化较大,平均气温多在5℃至11℃之间,4月前有冻土及残雪。白天有太阳,但晚上温度较底,
春天穿衣指南:
  在九寨沟的春天去旅游的话要根据当时的天气情况带好衣物,尽量带一件厚外套,白天穿一件体恤在里面,在玩累了的时候就可以脱掉外套。早上和晚上可以穿的厚一点。各种防晒及保湿用品也是必不可少的。如果遇上下雨降温,那么你可以带上一件比较薄一点的毛衣以备后患。
九寨沟的夏天:
  平均气温为17度至24度左右,昼夜温差比较大,白天日照强烈,紫外线强,夜晚则较为凉爽。
夏天穿衣指南:
  九寨沟早晚温差较大,所以大家只需要备一件长袖秋衣和防晒用品即可轻装上阵了,由于高原气候多变,而且也九寨沟的夏天是九寨的雨季,特别是在七月到八月,大家出门时也不要忘了带上雨具哦。
九寨沟的秋天:
  平均气温在12度至16度之间,昼夜温差比较大。
秋天穿衣指南:
  白天有时会有太阳,而晚上常会有降雨,也比较冷,白天基本上一件长袖秋衣就可以了,里面套一件短袖,而到了晚上就必须穿比较厚一点的衣服了,所以大家尽量带上一件厚衣服,八月也是九寨的雨季,大家出门时也不要忘了带上雨具。
九寨沟的冬天:
  平均气温在-1度至3度左右,天气较为寒冷,昼夜温差不大,白天有时候也会有太阳,但紫外线强,晚上气温更加咄咄逼人。
 文章转载来源: 郑州旅行社旅游资讯信息。
posted @ 2013-12-13 18:07 吴奇 阅读(231) | 评论 (0)编辑 收藏

近日,国外某知名网站曾经做过一份“全球最不受欢迎游客”榜单,爱花钱的中国游客不幸成为这份榜单的倒数第二位,和美国游客一起垫底。来自礼仪之邦的游客究竟惹了谁呢?

除了一些确实不太注意自己的言行的游客,事实上,有很多人觉得“我做得已经很不错了,也表现出了该有的素养”,可为何还是会被当地人侧目呢?

其实,情况很有可能是你并不了解当地的礼仪和风俗。很多我们在国内习以为常的习惯一旦出了国门,在外国人眼中便成为粗俗不礼貌的行为。如果你能注意到这些礼仪,再多用点心,会变得更受欢迎。不过,即使不出国门,也别忘了中华“礼仪之邦”的身份哦。

     值得一提的是禁止吸烟,这一做法已经在世界各个城市普及,而且禁烟的范围越来越大。现在到澳门的外地人,一打开手机会发现一条禁烟的信息,在规定禁烟场所到处都有禁烟告示,违者要罚款600澳元,而且绝不通融,近期不少内地赴澳门的游客吃了这个苦头。
  当然,这些禁令和惩罚并非完全针对文物或景区保护的,更多的是针对人类健康和社会秩序。对于一个国家和城市而言,这些禁令是根据保护公共利益而制定的,没有合理与不合理而言,必须遵守。作为外来的旅游者,更要入乡随俗,尊重当地的规定,不要试图觅寻为自己开脱的理由,更不能以身试法。
  郑州旅行社导游说道:遵守旅游地的法律法规,尊重当地人的风俗习惯,这是旅游者的基本行为准则,也是一个人自身文明的体现。
  在这方面,我们有很多观念需要改变,有法不依,或执法不严都是不正确的,这包括“中国式的过马路”行为。
posted @ 2013-12-12 18:13 吴奇 阅读(348) | 评论 (0)编辑 收藏

仅列出标题
共2页: 1 2 
软件之家 | 三次元