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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

3575閲覧

JavaのcurrentTimeMillisとWin32APIのGetSystemTimeが一致しないのは正常ですか?

yuni

総合スコア15

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

1グッド

0クリップ

投稿2016/02/07 09:06

編集2016/02/07 11:43

JavaのcurrentTimeMillisで取得した値はWin32APIのGetSystemTimeで取得した値を元にmktimeで算出した値と一致すると思っていたのですが、違うのでしょうか?

Java

1package test_currentTimeMillis; 2 3public class Main { 4 5 public static void main(String[] args) { 6 System.out.println("currentTimeMillis: "+System.currentTimeMillis()); 7 } 8 9} 10

C++

1#ifndef _WIN32_WINNT 2#define _WIN32_WINNT 0x0500 3#endif 4#ifndef OEMRESOURCE 5#define OEMRESOURCE 6#endif 7#ifndef STRICT 8#define STRICT 9#endif 10#include <windows.h> 11#include <ctime> 12#include <iostream> 13 14time_t make_time_t(const SYSTEMTIME & st) 15{ 16 tm time_data; 17 ZeroMemory(&time_data, sizeof(time_data)); 18 time_data.tm_year = st.wYear - 1900; 19 time_data.tm_mon = st.wMonth - 1; 20 time_data.tm_mday = st.wDay; 21 time_data.tm_hour = st.wHour; 22 time_data.tm_min = st.wMinute; 23 time_data.tm_sec = st.wSecond; 24 return mktime(&time_data); 25} 26 27unsigned long long time_to_ms(const SYSTEMTIME & systime) 28{ 29 time_t seconds = make_time_t(systime); 30 return seconds * 1000 + systime.wMilliseconds; 31} 32 33int main() 34{ 35 SYSTEMTIME time; 36 GetSystemTime(&time); 37 unsigned long long count = time_to_ms(time); 38 std::cout << count << std::endl; 39 40 return 0; 41}

この2つのプログラムを同時に起動して、値を確かめてみましたが
Java: 1454833348652
C++ : 1454800949464
という結果になり、32399188ミリ秒の差がありました。
32399188ミリ秒というのは約9時間です。
9時間と聞いてピンとくるのは「日本標準時 (JST) は協定世界時より9時間早い」という事実です。
JavaのcurrentTimeMillisは日本時間を返しているということなのでしょうか?

よろしくお願いいたします。

追伸:
解決しましたが解決したときのコードがきれいに貼れなかったのでここに貼っておきます。

C++

1#ifndef WIN32_LEAN_AND_MEAN 2#define WIN32_LEAN_AND_MEAN 3#endif 4#ifndef _WIN32_WINNT 5#define _WIN32_WINNT 0x0500 6#endif 7#ifndef OEMRESOURCE 8#define OEMRESOURCE 9#endif 10#ifndef STRICT 11#define STRICT 12#endif 13#include <windows.h> 14#include <ctime> 15#include <iostream> 16 17time_t make_time_t(const SYSTEMTIME & st) 18{ 19 tm time_data; 20 ZeroMemory(&time_data, sizeof(time_data)); 21 time_data.tm_year = st.wYear - 1900; 22 time_data.tm_mon = st.wMonth - 1; 23 time_data.tm_mday = st.wDay; 24 time_data.tm_hour = st.wHour; 25 time_data.tm_min = st.wMinute; 26 time_data.tm_sec = st.wSecond; 27 time_data.tm_isdst = 0; 28 return mktime(&time_data); 29} 30 31unsigned long long time_to_ms(const SYSTEMTIME & systime) 32{ 33 FILETIME file_time; 34 SystemTimeToFileTime(&systime, &file_time); 35 FILETIME local_ft; 36 FileTimeToLocalFileTime(&file_time, &local_ft); 37 SYSTEMTIME local_time; 38 FileTimeToSystemTime(&local_ft, &local_time); 39 time_t seconds = make_time_t(local_time); 40 return seconds * 1000 + systime.wMilliseconds; 41} 42 43int main() 44{ 45 SYSTEMTIME time; 46 GetSystemTime(&time); 47 std::cout << time.wYear << "year " << time.wMonth << "month " << time.wDay << "day " << time.wHour << "h " << time.wMinute << "min " << time.wSecond << "sec " << time.wMilliseconds << "ms" << std::endl; 48 unsigned long long count = time_to_ms(time); 49 std::cout << count << std::endl; 50 51 return 0; 52}
ikuwow👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

Win32APIのGetSystemTime関数は、UTC時間を返します。
mktime関数は引数のtm構造体に設定された「ローカル時間」をUTCに変換し、UNIXエポックからの経過時間を返すという仕様です。
ローカル時間を渡すべきところにUTCを渡しているので、時刻がUTCからさらに9時間戻されたというわけです。

投稿2016/02/07 11:02

catsforepaw

総合スコア5938

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

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

yuni

2016/02/07 11:44 編集

ご返信ありがとうございます。 なるほど、そういうことだったのですね。 試しにUTC時間からローカル時間に変換したものをmktimeに渡して経過ミリ秒を取得してみたところcurrentTimeMillisで取得したミリ秒と一致しました!! /*解決コードは質問文の最後に追伸として載せておきました*/ (UTCからローカルタイムに変換してmktime内部でローカルタイムからUTCに変換されるというものすごく無駄な処理が走っていますが、とりあえず…) 解決しました。ありがとうございました。
guest

0

試しにjavaで以下のコードを書いて実験してみました。

java

1import java.time.LocalDate; 2import java.time.LocalDateTime; 3import java.time.LocalTime; 4import java.util.Locale; 5 6public class Test3 { 7 public static void main(String[] args) { 8 Locale locale = Locale.getDefault(); 9 System.out.println(locale); 10 long l = System.currentTimeMillis(); 11 int ns = (int) (l % 1000) * 1000000; 12 l /= 1000; 13 int s = (int) (l % 60); 14 l /= 60; 15 int min = (int) (l % 60); 16 l /= 60; 17 int hour = (int) (l % 24); 18 l /= 24; 19 LocalDateTime ldt = LocalDateTime.of(LocalDate.ofEpochDay(l), LocalTime.of(hour, min, s, ns)); 20 System.out.println(ldt); 21 System.out.println(LocalDateTime.now()); 22 } 23} 24

その結果、以下の結果になりました。
ja_JP
2016-02-07T10:31:43.659
2016-02-07T19:31:43.990
JavaのSystem.currenntTimeMillis()は世界協定時刻を出しているようですが…

投稿2016/02/07 10:29

編集2016/02/07 10:33
swordone

総合スコア20649

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

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

yuni

2016/02/07 11:30

ご返信ありがとうございます。 こちらでもコードを実行してみたところ、どうやらJavaのSystem.currenntTimeMillis()は世界協定時刻を出しているようだということがわかりました。 GetSystemTimeの時点では問題なく世界協定時刻を取得することができていますから、その先のミリ秒への変換の部分で何か問題があるみたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問