3

このコードを print("Its Midnight") every 00:00AM に変更するにはどうすればよいですか?

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

int main(void)
{
  struct tm * localtime ( const time_t * ptr_time );
  struct tm 
 {
  int tm_sec;         /* segundos,  range 0 to 59          */
  int tm_min;         /* minutos, range 0 to 59           */
  int tm_hour;        /* horas, range 0 to 23             */
  int tm_mday;        /* dia do mes, range 1 to 31  */
  int tm_mon;         /* mes, range 0 to 11             */
  int tm_year;        /* numero de anos desde 1900   */
  int tm_wday;        /* dia da semana, range 0 to 6    */
  int tm_yday;        /* dia no ano, range 0 to 365  */
  int tm_isdst;       
  };
    time_t mytime;
    mytime = time(NULL);
    printf(ctime(&mytime));
/*
 if(str_time.tm_hour == 00 && str_time.tm_min == 00 && str_time.tm_sec == 00 )
{
printf("Its midnight");
}
*/
  return 0;
}

time_t の出力は次のとおりです。 Www Mmm dd hh:mm:ss yyyy

例: 2009 年 2 月 26 日火曜日 09:01:47

4

2 に答える 2

1

可能であれば、使用sleep()して一時停止します。とを
使用して、昼寝時間を決定します。time()localtime()

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

int main() {
    while (1) {
      time_t Now;
      if (time(&Now) == -1) {
        return -1;
      }
      struct tm tm;
      tm = *localtime(&Now);
      tm.tm_mday++;
      tm.tm_hour = 0;
      tm.tm_min = 0;
      tm.tm_sec = 0;
      tm.tm_isdst = -1;
      time_t Then;
      Then = mktime(&tm);
      if (Then == -1) {
        return -1;
      }
      if (Then <= Now) {
        return -1; // Time moving backwards - Hmmmm?
      }
      unsigned int NapTime = (unsigned int) (Then - Now);
      printf("Going to sleep %u\n", NapTime );
      fflush(stdout);  // Let's empty the buffers before nap time
      if (0 != sleep(NapTime)) {
        return -1; // trouble sleeping
        }
      // Done sleeping!
      printf("Midnight\n");
      fflush(stdout);
      sleep(10);
    }
  }
于 2013-10-16T20:58:05.080 に答える
1

一般に、time_t は 32 ビットまたは 64 ビットの整数として実装されます。ただし、これを定義する標準はありません。したがって、移植性を気にする場合は、おそらく使用しないでください。ただし、そうでない場合は、システムにどのように実装されているかをテストする必要があります。すでに整数として扱われている可能性があります。

編集: time_t のいくつかの要素を分割しようとしている場合は、次のようなものを使用します。

struct tm * localtime ( const time_t * ptr_time );

返される tm 構造体は次のようになります。

struct tm {
  int tm_sec;         /* seconds,  range 0 to 59          */
  int tm_min;         /* minutes, range 0 to 59           */
  int tm_hour;        /* hours, range 0 to 23             */
  int tm_mday;        /* day of the month, range 1 to 31  */
  int tm_mon;         /* month, range 0 to 11             */
  int tm_year;        /* The number of years since 1900   */
  int tm_wday;        /* day of the week, range 0 to 6    */
  int tm_yday;        /* day in the year, range 0 to 365  */
  int tm_isdst;       /* daylight saving time             */
};

編集2:

この例はgnu.orgから引っ張ってきました。あなたがそれらを使いたくないので、印刷物を取り出しましたが、残りはあなたが理解できるように残しました.

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

 int
 main (void)
 {
   time_t curtime;
   struct tm *loctime;

   /* Get the current time. */
   curtime = time (NULL);

   /* Convert it to local time representation. */
   loctime = localtime (&curtime);

   return 0;
 }
于 2013-10-16T16:19:41.377 に答える