AF SDKでData Archiveの日時型のPIポイントのデータを取得する際の標準時について

AF SDKでPIPointクラスのRecordedValueメソッドを用いてData Archiveの日時型のPIポイントのデータを取得します。

動作確認をしたところ、この時に取得できた日時データが世界標準時に変換されて取得されるように見えますが、これは変換されて取得される仕様でしょうか。

 

Data Archiveのデータ

 2000/01/01 0:00:00

 

AFSDKで取得できたデータ

 1999/12/31 15:00:00

※日本のサーバです。GMT+09:00

 

また、世界標準時に変換せずに取得する方法はあるでしょうか。

Parents
  • 最初に確認したいのですが、お使いのPI AF ClientのバージョンはPI AF Client 2018 (2.10.0.8628)でしょうか?

    このバージョンでは、PI PointにTimestamp型で保存した値を表示する際に、

    通常ではクライアントPCで設定されたタイムゾーンが使われるはずが、

    UTCで返ってくるという不具合が報告されております。

    解決策として、PI AF Client 2018 SP1にバージョンアップする必要があります。

    PI AF Client 2018からPI AF Client 2018 SP1にバージョンアップするパッチは、以下のページよりダウンロードが可能です:

    https://techsupport.osisoft.com/Downloads/File/e91a3872-0255-425d-abbd-bb917e3eb32f

     

    バージョンアップを行っても問題が解決しない場合はご連絡ください。

    以上、よろしくお願いいたします。

  • ご確認ありがとうございます。

    PI AF Clientのバージョンは2016 R2 SP1です。

    下記にプログラムと機能の画面を貼ります。(照会する場所はあっていますでしょうか?)

    本バージョンでも同様の不具合が発生しますか?


    AFclient%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E6%83%85%E5%.png

     

  • 再度確認したところ、

     

    AFSDKにおいてはDateTimes(Timestamp型)はデフォルトでUTCで扱われるようです。

     

    詳細につきましては、下記のページに記載がございます:

     

    対応策としては、DateTime.Parse.ToLocalTime()を使用することが考えられます。

     

    以下にC#のサンプルコードを記載します:

    "ServerTime"は対象のPIPoint名となります。

     

     var myPIServer = new PIServers().DefaultPIServer;
     var myPIPoint = PIPoint.FindPIPoint(myPIServer, "ServerTime");
     var value1 = myPIPoint.RecordedValue(DateTime.Now, AFRetrievalMode.Auto);
     Console.WriteLine(value1.ToString());
     var value2 = DateTime.Parse(value1.ToString()).ToLocalTime();
     Console.WriteLine(value2.ToString());
     Console.ReadLine();
    
    

Reply
  • 再度確認したところ、

     

    AFSDKにおいてはDateTimes(Timestamp型)はデフォルトでUTCで扱われるようです。

     

    詳細につきましては、下記のページに記載がございます:

     

    対応策としては、DateTime.Parse.ToLocalTime()を使用することが考えられます。

     

    以下にC#のサンプルコードを記載します:

    "ServerTime"は対象のPIPoint名となります。

     

     var myPIServer = new PIServers().DefaultPIServer;
     var myPIPoint = PIPoint.FindPIPoint(myPIServer, "ServerTime");
     var value1 = myPIPoint.RecordedValue(DateTime.Now, AFRetrievalMode.Auto);
     Console.WriteLine(value1.ToString());
     var value2 = DateTime.Parse(value1.ToString()).ToLocalTime();
     Console.WriteLine(value2.ToString());
     Console.ReadLine();
    
    

Children