Linux——時間問題(GMT,UTC,DST,CST,CETは何を表し,UTCとCSTの間の変換)
一、各略語の意味(GMT、UTC、DST、CST、CET):
gmt:「グリニッジ標準時間」(Greenwich Mean Time、略称G.M.T.)
utc:Coordinated Universal Time-世界協調時間(世界標準時間、世界統一時間とも呼ばれる)、
dst:夏の節約時間」Daylight Saving Time(D.S.T.)
cst:4個の異なるタイムゾーン
Central Standard Time (USA) UT-6:00
Central Standard Time (Australia) UT+9:30
China Standard Time UT+8:00
Cuba Standard Time UT-4:00
CSTは米国、オーストラリア、中国、キューバの4カ国の標準時間を同時に表すことができる.
Cet:Central European Time,CET)ヨーロッパ中部時間
関係:
UTC=GMT
CET=UTC/GMT+1時間
CST=UTC/GMT+8時間
CST=CET+7
世界24時間帯の区分
両地のスケジュールに比べて、世界の各タイムゾーンの時間と地名を表示できる世界タイムゾーンテーブル(World Time)は、精密で複雑に見えますが、通常、世界タイムゾーンテーブルのテーブルには世界24時間ゾーンの都市名が表示されていますが、この24時間ゾーンはどのように生成されていますか?以前は世界各地でそれぞれ現地時間を定めていたが、交通や電信の発達に伴い、各地の交流が頻繁になり、地方の時間によって多くの悩みが生じたため、西元1884年の国際会議で世界的な基準を制定した際、英国ロンドンのグリニッジという場所を零度経線の起点(本初子午線とも呼ばれる)と定められた.そして、地球を西から東へ24時間ごとに360°自転し、経度15°、時差1時間ごとに定めた.15°の経線ごとにこの時間帯の中央経線と呼ばれ、世界を24時間区に分け、23時間帯と180°経線の左右両側の2つの半時間区を含む.世界の時間から見ると、東経の時間は西経より早い.つまり、グリニッジ時間が昼12時であれば、中央経線15°Eの時間帯は午後1時、中央経線30°Eの時間帯は午後2時である.逆に、中央経線15°Wの時間帯は午前11時、中央経線30°Wの時間帯は午前10時である.台湾を例にとると、台湾は東経121°に位置し、換算するとグリニッジと8時間の時差がある.2人が同時にグリニッジの0°から東、西へ進むと、経線180°で24時間の差があるため、経線180°は国際換日線と定められ、西から東へこの線を通過すると日付が1日減算され、逆に東から西へ行くと1日増加する.
1、UTC:
Universal Time Coordinatedが世界を調和させる場合、世界標準時間とも呼ばれる.
多くの両地のスケジュールはGMTで表されているが、一部の両地のスケジュールにはGMTの文字が見えず、UTCという3つの英語のアルファベットが登場している.いったいUTCとは何なのか.実際、UTCとはCoordinated Universal Time-世界協調時間(世界標準時間、世界統一時間とも呼ばれる)を指し、平均太陽時(グリニッジ時間GMTを基準)、地軸運動修正後の新しいタイムスケール、および「秒」単位の国際原子時に総合的に精算された時間であり、計算過程はかなり厳格で精密である.そのため、「世界標準時間」の観点から言えば、UTCはGMTよりも正確である.その誤差値は0.9秒以内に保たなければならず、0.9秒を超えるとパリにある国際地球自転事務中央局が閏秒を発表し、UTCを地球自転周期と一致させる.したがって基本的にUTCの本質はGMTよりも正確な世界時間基準を強調しているが,現行の表項ではGMTとUTCの機能と精度に差はない.
2、GMT:
Greenwich Mean Timeグリニッジ平均時
UTCもGMTもイギリスロンドンのローカル時と同じなので、プログラムではUTCはGMTと変わらない.意味UTC=GMTは等しい
17世紀、グリニッジ王立天文台は海上覇権の拡張計画のために天体観測を行った.1675年に旧王立観測所(Old Royal Observatory)が正式に設立され、1884年にはグリニッジの子午線を通じて地球の東西両半球を区切る経度ゼロ度を決定した.観測所の入り口の壁には24時間の時計があり、現在の時間を示しています.世界にとって、ここで設定されている時間は世界の時間基準点で、世界はグリニッジの時間を基準に時間を設定しています.これが私たちがよく知っている「グリニッジ標準時間」(Greenwich Mean Time、G.M.T.)の由来で、時計に表示されています.この表には、元の場所と別の国の時間を同時に表示できる2つの時間機能があります.
3、Unixタイムスタンプ:
コンピュータで見たUTC時間は、いずれも(1970年01月01日0:00:00)から秒数を計算しています.見たUTC時間は1970年の時点から具体的な時間まで何秒ですか.この秒数がUnixタイムスタンプです.
4、CST時間:
CSTは、次の4つの異なるタイムゾーンを同時に表すことができます.
Central Standard Time (USA) UT-6:00
Central Standard Time (Australia) UT+9:30
China Standard Time UT+8:00
Cuba Standard Time UT-4:00
5、CET
(英語:Central European Time,CET)ヨーロッパ中部時間は、世界標準時間(UTC)より1時間早いタイムゾーン名の一つです.ほとんどのヨーロッパ諸国と一部の北アフリカ諸国に採用されています.冬季時間はUTC+1,夏季欧州サマータイムはUTC+2である.
6、DST:
Daylight Saving Time「夏の時間節約」
夏に太陽が昇るのが早い時、時計を1時間速くして日光の使用を早めることを指し、イギリスではサマータイム(Summer Time)と呼ばれています.この構想は1784年にアメリカのバンジェミン・フランクリンによって提案され、1915年にドイツは夏の日光の時間節約を正式に実施した最初の国となり、照明と消費電力を削減した.以来、世界のヨーロッパや北米を中心とした約70カ国がこのやり方を引用している.現在、二つのタイムゾーンに分かれているインドも、全国で夏の日光節約を統一すべきかどうかを検討している.欧州の携帯電話にもGSMシステムの基地局が多く、現地時間を伝送するほか、夏の日光を含めて時間を節約し、携帯電話の時間基準として、利用者は自分で開くか閉じるかを決めることができる.注目すべきは、一部の国では「夏の時間節約」という制度が実施されているので、海外に行くときは現地の習慣に従って時計の上で調整することを忘れないでください.これは機械時計にはない機能設計ですよ.
二、CST(中国沿海時間)とUTC(世界協調時間)の転換
実行結果:
gmt:「グリニッジ標準時間」(Greenwich Mean Time、略称G.M.T.)
utc:Coordinated Universal Time-世界協調時間(世界標準時間、世界統一時間とも呼ばれる)、
dst:夏の節約時間」Daylight Saving Time(D.S.T.)
cst:4個の異なるタイムゾーン
Central Standard Time (USA) UT-6:00
Central Standard Time (Australia) UT+9:30
China Standard Time UT+8:00
Cuba Standard Time UT-4:00
CSTは米国、オーストラリア、中国、キューバの4カ国の標準時間を同時に表すことができる.
Cet:Central European Time,CET)ヨーロッパ中部時間
関係:
UTC=GMT
CET=UTC/GMT+1時間
CST=UTC/GMT+8時間
CST=CET+7
世界24時間帯の区分
両地のスケジュールに比べて、世界の各タイムゾーンの時間と地名を表示できる世界タイムゾーンテーブル(World Time)は、精密で複雑に見えますが、通常、世界タイムゾーンテーブルのテーブルには世界24時間ゾーンの都市名が表示されていますが、この24時間ゾーンはどのように生成されていますか?以前は世界各地でそれぞれ現地時間を定めていたが、交通や電信の発達に伴い、各地の交流が頻繁になり、地方の時間によって多くの悩みが生じたため、西元1884年の国際会議で世界的な基準を制定した際、英国ロンドンのグリニッジという場所を零度経線の起点(本初子午線とも呼ばれる)と定められた.そして、地球を西から東へ24時間ごとに360°自転し、経度15°、時差1時間ごとに定めた.15°の経線ごとにこの時間帯の中央経線と呼ばれ、世界を24時間区に分け、23時間帯と180°経線の左右両側の2つの半時間区を含む.世界の時間から見ると、東経の時間は西経より早い.つまり、グリニッジ時間が昼12時であれば、中央経線15°Eの時間帯は午後1時、中央経線30°Eの時間帯は午後2時である.逆に、中央経線15°Wの時間帯は午前11時、中央経線30°Wの時間帯は午前10時である.台湾を例にとると、台湾は東経121°に位置し、換算するとグリニッジと8時間の時差がある.2人が同時にグリニッジの0°から東、西へ進むと、経線180°で24時間の差があるため、経線180°は国際換日線と定められ、西から東へこの線を通過すると日付が1日減算され、逆に東から西へ行くと1日増加する.
1、UTC:
Universal Time Coordinatedが世界を調和させる場合、世界標準時間とも呼ばれる.
多くの両地のスケジュールはGMTで表されているが、一部の両地のスケジュールにはGMTの文字が見えず、UTCという3つの英語のアルファベットが登場している.いったいUTCとは何なのか.実際、UTCとはCoordinated Universal Time-世界協調時間(世界標準時間、世界統一時間とも呼ばれる)を指し、平均太陽時(グリニッジ時間GMTを基準)、地軸運動修正後の新しいタイムスケール、および「秒」単位の国際原子時に総合的に精算された時間であり、計算過程はかなり厳格で精密である.そのため、「世界標準時間」の観点から言えば、UTCはGMTよりも正確である.その誤差値は0.9秒以内に保たなければならず、0.9秒を超えるとパリにある国際地球自転事務中央局が閏秒を発表し、UTCを地球自転周期と一致させる.したがって基本的にUTCの本質はGMTよりも正確な世界時間基準を強調しているが,現行の表項ではGMTとUTCの機能と精度に差はない.
2、GMT:
Greenwich Mean Timeグリニッジ平均時
UTCもGMTもイギリスロンドンのローカル時と同じなので、プログラムではUTCはGMTと変わらない.意味UTC=GMTは等しい
17世紀、グリニッジ王立天文台は海上覇権の拡張計画のために天体観測を行った.1675年に旧王立観測所(Old Royal Observatory)が正式に設立され、1884年にはグリニッジの子午線を通じて地球の東西両半球を区切る経度ゼロ度を決定した.観測所の入り口の壁には24時間の時計があり、現在の時間を示しています.世界にとって、ここで設定されている時間は世界の時間基準点で、世界はグリニッジの時間を基準に時間を設定しています.これが私たちがよく知っている「グリニッジ標準時間」(Greenwich Mean Time、G.M.T.)の由来で、時計に表示されています.この表には、元の場所と別の国の時間を同時に表示できる2つの時間機能があります.
3、Unixタイムスタンプ:
コンピュータで見たUTC時間は、いずれも(1970年01月01日0:00:00)から秒数を計算しています.見たUTC時間は1970年の時点から具体的な時間まで何秒ですか.この秒数がUnixタイムスタンプです.
4、CST時間:
CSTは、次の4つの異なるタイムゾーンを同時に表すことができます.
Central Standard Time (USA) UT-6:00
Central Standard Time (Australia) UT+9:30
China Standard Time UT+8:00
Cuba Standard Time UT-4:00
5、CET
(英語:Central European Time,CET)ヨーロッパ中部時間は、世界標準時間(UTC)より1時間早いタイムゾーン名の一つです.ほとんどのヨーロッパ諸国と一部の北アフリカ諸国に採用されています.冬季時間はUTC+1,夏季欧州サマータイムはUTC+2である.
6、DST:
Daylight Saving Time「夏の時間節約」
夏に太陽が昇るのが早い時、時計を1時間速くして日光の使用を早めることを指し、イギリスではサマータイム(Summer Time)と呼ばれています.この構想は1784年にアメリカのバンジェミン・フランクリンによって提案され、1915年にドイツは夏の日光の時間節約を正式に実施した最初の国となり、照明と消費電力を削減した.以来、世界のヨーロッパや北米を中心とした約70カ国がこのやり方を引用している.現在、二つのタイムゾーンに分かれているインドも、全国で夏の日光節約を統一すべきかどうかを検討している.欧州の携帯電話にもGSMシステムの基地局が多く、現地時間を伝送するほか、夏の日光を含めて時間を節約し、携帯電話の時間基準として、利用者は自分で開くか閉じるかを決めることができる.注目すべきは、一部の国では「夏の時間節約」という制度が実施されているので、海外に行くときは現地の習慣に従って時計の上で調整することを忘れないでください.これは機械時計にはない機能設計ですよ.
二、CST(中国沿海時間)とUTC(世界協調時間)の転換
#include
#include
#include
#if 0
typedef long __kernel_suseconds_t;
typedef __kernel_suseconds_t suseconds_t;
typedef struct timeval {
time_t tv_sec; /* seconds */
suseconds_t tv_usec; /* microseconds */
}TIMEVAL;
typedef struct timespec {
time_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
}TIMESPEC;
typedef struct timezone {
int tz_minuteswest; /* minutes west of Greenwich */
int tz_dsttime; /* type of dst correction */
}TIMEZONE;
#endif
/*
* * * The struct used to pass data via the following ioctl. Similar to the
* * * struct tm in , but it needs to be here so that the kernel
* * * source is self contained, allowing cross-compiles, etc. etc.
* * */
typedef struct rtc_time {
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_yday;
int tm_isdst;
}RTC_TIME;
static const unsigned char rtc_days_in_month[] = {
31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
};
static const unsigned short rtc_ydays[2][13] = {
/* Normal years */
{ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 },
/* Leap years */
{ 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 }
};
#define LEAPS_THRU_END_OF(y) ((y)/4 - (y)/100 + (y)/400)
#define LEAP_YEAR(year) ((!(year % 4) && (year % 100)) || !(year % 400))
/*
* * The number of days in the month.
* */
int rtc_month_days(unsigned int month, unsigned int year)
{
return rtc_days_in_month[month] + (LEAP_YEAR(year) && month == 1);
}
/*
* * The number of days since January 1. (0 to 365)
* */
int rtc_year_days(unsigned int day, unsigned int month, unsigned int year)
{
return rtc_ydays[LEAP_YEAR(year)][month] + day-1;
}
/*
* * Convert seconds since 01-01-1970 00:00:00 to Gregorian date.
* */
void rtc_time_to_tm(unsigned long time, struct rtc_time *tm)
{
register int days, month, year;
days = time / 86400;
time -= days * 86400;
/* day of the week, 1970-01-01 was a Thursday */
tm->tm_wday = (days + 4) % 7;
year = 1970 + days / 365;
days -= (year - 1970) * 365
+ LEAPS_THRU_END_OF(year - 1)
- LEAPS_THRU_END_OF(1970 - 1);
if (days < 0) {
year -= 1;
days += 365 + LEAP_YEAR(year);
}
tm->tm_year = year - 1900;
tm->tm_yday = days + 1;
for (month = 0; month < 11; month++) {
int newdays;
newdays = days - rtc_month_days(month, year);
if (newdays < 0)
break;
days = newdays;
}
tm->tm_mon = month;
tm->tm_mday = days + 1;
tm->tm_hour = time / 3600;
time -= tm->tm_hour * 3600;
tm->tm_min = time / 60;
tm->tm_sec = time - tm->tm_min * 60;
}
int main(void){
struct timeval tv;
struct timezone tz;
RTC_TIME tm;
gettimeofday(&tv, &tz);
rtc_time_to_tm(tv.tv_sec, &tm);
fprintf(stdout, "UTC time :%04d-%02d-%02d %02d:%02d:%02d
",
tm.tm_year+1900,tm.tm_mon, tm.tm_mday, tm.tm_hour,
tm.tm_min, tm.tm_sec);
rtc_time_to_tm(tv.tv_sec + 60*60*8, &tm);
fprintf(stdout, "After adjust :%04d-%02d-%02d %02d:%02d:%02d
",
tm.tm_year+1900,tm.tm_mon, tm.tm_mday, tm.tm_hour,
tm.tm_min, tm.tm_sec);
return 0;
}
実行結果:
[root@localhost 20190528]# ./utc_cst_time
UTC time :2019-04-28 13:44:57
After adjust :2019-04-28 21:44:57