3

インドの株式市場の価格データがありますが、その日時はGMTであるため、正しい日時を表すデータを使用できます。

DB内の一部のレコードの日付と時刻を現在のタイムゾーンであるGMTからISTに変換する必要があります。

mysql> desc price_hist;
+---------------+-----------------------+------+-----+---------+----------------+
| Field         | Type                  | Null | Key | Default | Extra          |
+---------------+-----------------------+------+-----+---------+----------------+
| trade_id      | int(11)               | NO   | PRI | NULL    | auto_increment |
| contract_name | varchar(14)           | NO   | MUL | NULL    |                |
| trade_date    | date                  | NO   |     | NULL    |                |
| trade_time    | varchar(6)            | NO   |     | NULL    |                |
| trade_price   | decimal(10,4)         | NO   |     | NULL    |                |
| trade_volume  | bigint(20)            | NO   |     | NULL    |                |
+---------------+-----------------------+------+-----+---------+----------------+
8 rows in set (0.02 sec)

を実行してDB自体のタイムゾーンを変更しようとしましたが、機能しませんでした。

select convert_tz("2010-06-30 19:00:00",'GMT','IST');
+-----------------------------------------------+
| convert_tz("2011-06-30 09:00:00",'GMT','IST') |
+-----------------------------------------------+
| NULL |
+-----------------------------------------------+
1 row in set (0.01 sec) 

私はBoostを初めて使用しますが、コード自体でこれを処理するためにBoostdateを使用することをお勧めします。

いくつかの投稿で日時変換を検索しましたが、特定の質問に答える投稿が見つかりませんでした。

特定のリンクがある場合、またはもっと良いのは、誰かが共有できるブーストコードの例です。これは、私のようなnubeeにとって素晴らしいスタートです。:-)

提供されているリファレンス@Karisonを使用して、次のコードを記述しました。

#include "boost/date_time/local_time/local_time.hpp"
  #include <iostream>

  int  main() 
  {
    using namespace boost::posix_time;
    using namespace boost::gregorian;
    using namespace boost::local_time;

    tz_database tz_db;
    time_zone_ptr chi_tz=tz_db.time_zone_from_region("America/Chicago");
    time_zone_ptr jst_tz(new posix_time_zone("EST+5:00:00"));


    local_date_time jpn_time(date(2012,Jan,3), hours(16), jst_tz,local_date_time::NOT_DATE_TIME_ON_ERROR);
    local_date_time osaka_time = jpn_time.local_time_in(chi_tz);
    std::cout<<"osaka_time: "<<osaka_time<<std::endl;
return 0;
}
4

2 に答える 2

2

まず、構文を変更して、質問が 3 つあることがわかるように分けましょう。

の最初の構文はconvert_tz、呼び出しが次のようになる文字列を取ります。

select convert_tz('2011-06-30 09:00:00','GMT','IST')

二重引用符ではなく単一の目盛り。

2番。マシンが同じタイムゾーンにあり、POSIX 準拠のシステムで実行している場合は、日付を表す文字列を取得して次の操作を実行できます。

struct tm result;
strptime(<time string>, <format string>, &result);
time_t epoch_time = mktime(&result);

これにより、必要なことを行うために使用できる標準の UNIX 時間が得られます。

最後になりましたが、ブーストです。確かにこれは強力なライブラリですが、現時点でプロジェクトを複雑にする必要があるとは思いません。まだ試してみたい、または POSIX 準拠のシステムを使用していない場合は、http://www.boost.org/doc/libs/1_48_0/doc/html/date_time.htmlを参照してください。ptimeデータベースから返される文字列から作成し、必要に応じて操作する必要があります。必要に応じて部分を使用local_timeしてタイムゾーン オブジェクトを作成し、データベースから取得した時間をそれに対してチェックします。http://www.boost.org/doc/libs/1_48_0/doc/html/date_time/examples/general_usage_examples.htmlの例を見ることができます

特に最後のもの。したがって、あなたの例では次のようになります。

time_zone_ptr src_zone(new posix_time_zone("IST+05:30:00"));
time_zone_ptr dst_zone(new posix_time_zone("CST"));
local_date_time trd_time(date(....), hours(...), src_zone, 
                         local_date_time::NOT_DATE_TIME_ON_ERROR);
local_date_time res_time = trd_time.local_time_in(dst_zone);

100% 正しいとは限りませんが、ご理解いただければ幸いです。

例:

#include "boost/date_time/local_time/local_time.hpp"
#include <iostream>

int  main() 
{
    using namespace boost::posix_time;
    using namespace boost::gregorian;
    using namespace boost::local_time;

    tz_database tz_db;
    time_zone_ptr chi_tz(new posix_time_zone("CST-06:00:00");
    time_zone_ptr jst_tz(new posix_time_zone("JST+09:00:00"));

    local_date_time jpn_time(date(2012,Jan,3), hours(16),
                             chi_tz,local_date_time::NOT_DATE_TIME_ON_ERROR);
    local_date_time osaka_time = jpn_time.local_time_in(jst_tz);
    std::cout<<"osaka_time: "<<osaka_time<<std::endl;
    return 0;
}
于 2012-01-18T20:26:35.823 に答える
1

これに対処するいくつかの方法があります:

1)ウィンドウ:

#include "stdafx.h"
#include <windows.h>

#include <iostream>
#include <string>
#include <locale>
#include <time.h>
#include <vector>

#include <boost/date_time/local_time/local_time.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/date_time.hpp>
#include <boost/algorithm/string/classification.hpp>
#include <boost/algorithm/string/split.hpp>

using namespace boost::posix_time;
using namespace boost::gregorian;
using namespace boost::local_time;

//***********
// U T I L S
//***********

std::string WCHAR2StdString(WCHAR* wchar_buf)
{
    char narrow_buf[260];
    char DefChar = ' ';
    WideCharToMultiByte(CP_ACP,0,wchar_buf,-1, narrow_buf,260,&DefChar, NULL);
    return std::string (narrow_buf);
}

std::string LocalTimeZone(TIME_ZONE_INFORMATION & tzi)
{
    short int tz_bias = tzi.Bias;
    std::string tzName(WCHAR2StdString(tzi.StandardName));

    // Get acronym for X_(Zone) Standard Time: 'X_ST'
    std::vector<std::string> vec;
    boost::split(vec, tzName, boost::is_any_of(" "));
    std::string result;
    for(std::vector<std::string>::iterator i = vec.begin(); i != vec.end(); ++i)
    {
        std::string s = *i;
        char c = s.c_str()[0];
        result += c;
    }
    return result;
}

//**********
// M A I N
//**********

int _tmain(int argc, _TCHAR* argv[])  
{
    using namespace boost::posix_time;
    using namespace boost::gregorian;
    using namespace boost::local_time;

    // Windows Timezone info.
    TIME_ZONE_INFORMATION tzi;
    DWORD res = GetTimeZoneInformation(&tzi);

    // Timezone string
    std::string local_tz_str = LocalTimeZone(tzi);

    // Hour Bias
    std::stringstream ss;
    ss << (abs(tzi.Bias)/60);
    std::string bias_hrs(ss.str());

    // Build string: e.g. CST+08:00:00
    short int sign = 0;
    tzi.Bias > 0 ? sign = -1 : sign = 1;

    // Pad with zeros as necessray
    if(abs(tzi.Bias/60) < 10) bias_hrs = ("0" + bias_hrs);
    bias_hrs += ":00:00";
    (sign > 0) ? (bias_hrs = local_tz_str + "+" + bias_hrs) : (bias_hrs = local_tz_str + "-" + bias_hrs);

    local_tz_str = bias_hrs; // local_tz_str is a better name to continue with

    std::string formatted_tz_desc(bias_hrs);

    // Construct local_date_time and time_zone etc.
    long long ticksFromEpoch = 1329122250168; // !!! (assumed input format) milliseconds from 1970-01-01 00:00:00
    std::time_t tt = static_cast<time_t>(ticksFromEpoch/1000); // (ticksFromEpoch/1000) gives seconds since epoch 
    ptime pt = from_time_t(tt);
    time_zone_ptr zone(new boost::local_time::posix_time_zone(formatted_tz_desc));
    local_date_time locally_adjusted_date_time(pt, zone);

    // Format stringstream: YYYY-Mmm-dd HH:MM:SS
    std::stringstream strm;
    strm.imbue(std::locale(std::cout.getloc(), new local_time_facet("%Y-%m-%d %H:%M:%S")));
    strm << locally_adjusted_date_time;

    // Print adjusted result
    std::cout << strm.str() << std::endl << std::endl; 

    return 0;
  }

次のように、stdclibsからタイムゾーン情報を取得できます。

2)Posix:

#include <stdio.h>
#include <time.h>
#include <string>
#include <iostream>
#include <vector>
#include <boost/algorithm/string/classification.hpp>
#include <boost/algorithm/string/split.hpp>

std::string LocalTimeZone();

int main() {
    std::cout << LocalTimeZone() << std::endl;
    return 0;
}

std::string LocalTimeZone()
{
    time_t  now = time(NULL);
    struct tm tnow = *localtime(&now);
    std::string tz = tnow.tm_zone;

    // Format the struct:
    char    buff[100];
    strftime( buff, sizeof buff, "%a %b %d %Y %T %Z%z", &tnow );

    // Parse the bits you want:
    std::vector<std::string> vec;
    const std::string s(buff);
    boost::split(vec, s, boost::is_any_of(" "));
    std::vector<std::string>::iterator i = vec.end();

    return *--i;
}

タイムゾーン文字列をフォーマットしたら、たとえばCST+08:00:00上記のブースト方法に進むことができます。

HTH

于 2012-02-14T10:05:35.403 に答える