0

現在の時刻と 10 分前の時刻を出力したいのですが、X 分前の time_t を生成する方法がわかりません...

#include <time.h>

time_t current_time;
time_t tenMinutesAgo;

current_time = time(NULL);
tenMinutesAgo = ???;

printf("current time = %s, 10 minutes ago = %s\n",ctime(current_time),ctime(tenMinutesAgo));

どんな助けでも大歓迎です!

4

2 に答える 2

3

1970年 1 月 1 日の 00:00:00 UTC (または 1970-01-01T00:00:00Z ISO 8601)エポック (通常は Unix エポック)time(NULL)からの秒数を返すため:

#include <time.h>
#include <stdio.h>

time_t current_time;
time_t tenMinutesAgo;

int main() {
  char* c_time_string;
  current_time = time(NULL);
  tenMinutesAgo = current_time - 10*60;//the time 10 minutes ago is 10*60

  c_time_string = ctime(&tenMinutesAgo);//convert the time tenMinutesAgo into a string format in the local time format

  printf("The time 10 minutes ago in seconds from the epoch is: %i\n", (int)tenMinutesAgo);
  printf("The time 10 minutes ago from the epoch in the local time format is: %s\n", c_time_string);

  return 0;
}

編集:

@PaulGriffiths は、私のソリューションが移植可能であることが保証されていないという点で優れています。移植性が必要な場合は、彼の答えを確認してください。ただし、最も一般的な OS フレーバー (*nix、Solaris、Windows) でコードを記述している場合、このソリューションは機能します。

于 2013-08-11T11:58:18.777 に答える
0

time_tC標準では秒単位で測定する必要がないため、最初の答えは移植可能であるとは限りません。

time_tただし、 は実数型であるため、算術演算を行うことができます。これにより、それを行うためのルートが得られます。struct tm2 秒間隔で設定できます。

struct tm first;
struct tm second;
time_t ts_first;
time_t ts_second;
double sec_diff;

first.tm_year = 100;
first.tm_mon = 0;
first.tm_mday = 2;
first.tm_hour = 1;
first.tm_minute = 20;
first.tm_second = 20;
first.tm_isdst = -1;

second.tm_year = 100;
second.tm_mon = 0;
second.tm_mday = 2;
second.tm_hour = 1;
second.tm_minute = 20;
second.tm_second = 21;
second.tm_isdst = -1;

それらをtime_t値に変換します。

ts_first = mktime(&first);
if ( ts_first == -1 ) {
    /* Do your error checking  */
}

ts_second = mktime(&second);
if ( ts_second == -1 ) {
    /* Do your error checking  */
}

彼らに電話difftime()してください:

sec_diff = difftime(ts_second, ts_first);

次に、必要なsec_diff秒数を掛けて、 によって返される値からそれを引くことができますtime

もちろん、利用可能なシステムの時間分解能が 1 秒を超える場合、これは機能しませんtm_min。代わりに分を探しているので、メンバーを変更してみることができますが、これはほとんどありません。

于 2013-08-11T12:33:10.360 に答える