質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Q&A

解決済

2回答

4184閲覧

Visual Studio 2019 C++ 現在時刻を得る方法

yasu2711

総合スコア7

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

0グッド

1クリップ

投稿2020/05/07 03:12

編集2020/05/12 04:57

前提・実現したいこと

5分ごとに起動するプログラムを作っております。
*時5分、10分、15分、20分、25分、30分、35分、40分、45分、50分、55分
プログラムを立ち上げて、最初に現在時刻を取得し各5分との差を求めて、それまでsleepさせようとしております。
localtime_sを用いて、時刻、分、秒を取得しようとしております。

発生している問題・エラーメッセージ

エラーは出ていないのですが、&imanojikan の時刻、分、秒が「-1」という数値としかなりません。

該当のソースコード

Visual Studio 2019 C++

#include <stdio.h> #include <time.h> int main() { //毎5分に開始 time_t jikan; struct tm imanojikan; errno_t error; localtime_s(&imanojikan, &jikan); cout << imanojikan.tm_min << endl; int mod = imanojikan.tm_min % 5; //5分の余り値を求める //std::cout << "0分目のパターン決定\n"; //時刻を1秒ごとに計測→5分刻み+1分で開始 //std::cout << "1分目のパターン決定\n"; //時刻を1秒ごとに計測→5分刻み+2分で開始 //std::cout << "2分目のパターン決定\n"; //時刻を1秒ごとに計測→5分刻み+3分で開始 //std::cout << "3分目のパターン決定\n"; //時刻を1秒ごとに計測→5分刻み+4分で開始 //std::cout << "4分目のパターン決定\n"; return 0; }

試したこと

localtime_sを用いる前は、localtimeを使ったのですが、
エラーとなりましてlocaltime_sを使っています。

どなたかおわかりの方がいらっしゃいましたらお教えください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

C++

1#include <iostream> 2#include <chrono> 3#include <ctime> 4 5int main() { 6 auto now = std::chrono::system_clock::now(); 7 std::time_t tim = std::chrono::system_clock::to_time_t(now); 8 std::tm tm; 9 // vc++ では 戻り値が 0 なら成功。 (POSIXだと non-0 が成功。なんとかならんもんかね) 10 if ( localtime_s(&tm, &tim) == 0 ) { 11 std::cout << tm.tm_hour << ':' << tm.tm_min << ':' << tm.tm_sec << std::endl; 12 } 13}

投稿2020/05/07 03:41

編集2020/05/07 04:51
episteme

総合スコア16612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yasu2711

2020/05/08 00:40

episteme様 ありがとうございます。所望通りに稼働しています。毎5分で起動するプログラムにとりかかります。今後とも何卒よろしくお願いいたします。
episteme

2020/05/08 01:50

え? なんで質問コードが僕の書いたのに置き換わってんの?
yasu2711

2020/05/08 01:55

申し訳ありません。書き換えます。
yasu2711

2020/05/08 01:59

元に戻しました。ご迷惑をおかけいたしました。
episteme

2020/05/08 02:25

戻ってません。
yasu2711

2020/05/08 02:59

再度失礼いたしました。古いプログラムを消去してしまいました。再現できる範囲で再現しました。後ほど更新します。
episteme

2020/05/08 11:44

#include <stdio.h> #include <time.h> int main() { //毎5分に開始 time_t jikan; struct tm imanojikan; errno_t error; localtime_s(&imanojikan, &jikan); cout << imanojikan.tm_min << endl; int mod = imanojikan.tm_min % 5; //5分の余り値を求める //std::cout << "0分目のパターン決定\n"; //時刻を1秒ごとに計測→5分刻み+1分で開始 //std::cout << "1分目のパターン決定\n"; //時刻を1秒ごとに計測→5分刻み+2分で開始 //std::cout << "2分目のパターン決定\n"; //時刻を1秒ごとに計測→5分刻み+3分で開始 //std::cout << "3分目のパターン決定\n"; //時刻を1秒ごとに計測→5分刻み+4分で開始 //std::cout << "4分目のパターン決定\n"; return 0; }
yasu2711

2020/05/09 05:40

episteme様 かさねがさねお手数をおかけいたしまして申し訳ありません。修正いたしました。今後とも何卒よろしくお願いいたします。
y_waiwai

2020/05/09 06:03 編集

コードの中で待たせるより、 ・5分のタイマーを使ってそのイベントで実行させる ・タスクマネージャかなんかで5分ごとにコードを実行させる とかすればどうでしょう
episteme

2020/05/09 07:40

僕もそうするな...
yasu2711

2020/05/09 07:53

y_waiwai様、episteme様 ありがとうございます。タスクマネージャも試してみます。
guest

0

localtime_s、_localtime32_s、_localtime64_s | Microsoft Docs

localtime_s関数は、時刻を得る、のではなくて、時刻を変換する関数です
まずはtime関数で時刻を取得しておいて、それを渡してやりましょう

投稿2020/05/07 03:25

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yasu2711

2020/05/07 23:53

y_waiwai様 早速の回答をありがとうございました。time関数で時刻は取得できました。次は「分」を抽出して5分との差分を求めるプログラムに着手します。今後とも何卒よろしくお願いいたします。
y_waiwai

2020/05/08 00:08

int sabun = 5 - imanojikan.tm_min % 5; でどーでしょう
yasu2711

2020/05/08 01:54

y_waiwai様 早速の回答をありがとうございました。上記を反映して毎5分との差分は求められました。 →プログラムを改編しました(上記)。 たとえば10時32分でしたら、sabun=3 となり、10時35分00秒にプログラムがスタートするようにしたいと考えております。sleep untilで検索をかけて以下を見つけました。 auto abs_time = std::chrono::system_clock::now() + std::chrono::seconds(15); //... std::this_thread::sleep_until(abs_time); abs_timeに tm.tm_hour tm.tm_min+sabun tm.tm_sec=00 を書き込むというので よろしいでしょうか。
episteme

2020/05/08 05:14 編集

> たとえば10時32分でしたら、sabun=3 となり、10時35分00秒にプログラムがスタートするようにしたいと考えております。 つまり sabun分間 sleepしたいわけで、だったら std::this_thread::sleep_for(std::chrono::minutes(sabun)); でよくね?
yasu2711

2020/05/09 05:43

episteme様 回答をありがとうございます。sabun分間 sleepも考えましたが、毎5分00秒に開始したいので、困っております。
episteme

2020/05/09 07:39

次の定時まで あと何分 ではなく あと何秒 を求めればいいんじゃなくて?
yasu2711

2020/05/09 07:52

episteme様 以下で解決しました。分と秒を分けてsleepすることにしました。 int sabunmin = 4 - tm.tm_min % 5; int sabunsec = 60 - tm.tm_sec; std::this_thread::sleep_for(std::chrono::minutes(sabunmin)); std::this_thread::sleep_for(std::chrono::seconds(sabunsec)); ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問