Highlighted
Absent Member.
Absent Member.
2740 views

Get the date and time the local server

Jump to solution

I need to get the date and time of the local server and write a file.
It can not be the workstation because the user can change them.
Is there some function or class that execute this process?

VC 2.2 .NET

WINSERVER 2003

0 Likes
2 Solutions

Accepted Solutions
Highlighted
Absent Member.
Absent Member.

Hi Chris,

The your example worked in Net Express but two hours forward already in Visual Cobol 2.2 .NET show the following error (attached). It would be the missing of a namespace?

View solution in original post

0 Likes
Highlighted
Micro Focus Expert
Micro Focus Expert

This is a native Windows API function and not a .NET Framework class so when it is being called from managed code P/Invoke.is being used under the covers. The warning you are getting is normal in this situation. Because this is a native WINAPI call I would recommend that you call it from a native COBOL program and then call that program from your managed code in order to get the returned time.

The reason the returned hours may be different than your local time is that the returned value is the UTC (Universal Coordinated Time) of the server, and must be adjusted by TOD_TIMEZONE minutes in order to get the correct local time.

This can be done by converting the time into a DateTime object and then using the ToLocalTime method.

So the managed code project would look something like the following (add a reference to the native .dll)

       identification division.
       program-id. program1.
       data division.
       working-storage section.
       01 UncServerName pic x(100) value z"myserver".
       01 net-api-status  pic x(4) comp-5 value 0.
       01 Buffer.
          05 tod_elapsedt pic x(4) comp-5.
          05 tod_msecs    pic x(4) comp-5.
          05 tod_hours    pic x(4) comp-5.
          05 tod_mins     pic x(4) comp-5.
          05 tod_secs     pic x(4) comp-5.
          05 tod_hunds    pic x(4) comp-5.
          05 tod_timezone pic s9(9) comp-5.
          05 tod_tinterval pic x(4) comp-5.
          05 tod_day      pic x(4) comp-5.
          05 tod_month    pic x(4) comp-5.
          05 tod_year     pic x(4) comp-5.
          05 tod_weekday  pic x(4) comp-5.
       01 localtime type DateTime.
       procedure division.

           call "getnetremotetod" 
              using uncservername
                    buffer
                    net-api-status
           end-call
           if net-api-status not = 0
              display "error = " net-api-status
              goback
           end-if
           
           set localtime to 
              new DateTime(tod_year, tod_month, tod_day, tod_hours, tod_mins, tod_secs, type DateTimeKind::Utc)::ToLocalTime
           
           display localtime
           goback.


and the native code program would look like:

      $set case 
       identification division.
       program-id. getnetremotetod.
       environment division.
       configuration section.
       special-names.
          call-convention 66 is winapi.
       data division.
       working-storage section.
       01 pp procedure-pointer.
       01 pBuffer       pointer.
       linkage section.
       01 UncServerName pic x(100).
       01 passedBuffer.
          05 pb_elapsedt pic x(4) comp-5.
          05 pb_msecs    pic x(4) comp-5.
          05 pb_hours    pic x(4) comp-5.
          05 pb_mins     pic x(4) comp-5.
          05 pb_secs     pic x(4) comp-5.
          05 pb_hunds    pic x(4) comp-5.
          05 pb_timezone pic s9(9) comp-5.
          05 pb_tinterval pic x(4) comp-5.
          05 pb_day      pic x(4) comp-5.
          05 pb_month    pic x(4) comp-5.
          05 pb_year     pic x(4) comp-5.
          05 pb_weekday  pic x(4) comp-5.
       01 net-api-status  pic x(4) comp-5.
       
       01 Buffer.
          05 tod_elapsedt pic x(4) comp-5.
          05 tod_msecs    pic x(4) comp-5.
          05 tod_hours    pic x(4) comp-5.
          05 tod_mins     pic x(4) comp-5.
          05 tod_secs     pic x(4) comp-5.
          05 tod_hunds    pic x(4) comp-5.
          05 tod_timezone pic s9(9) comp-5.
          05 tod_tinterval pic x(4) comp-5.
          05 tod_day      pic x(4) comp-5.
          05 tod_month    pic x(4) comp-5.
          05 tod_year     pic x(4) comp-5.
          05 tod_weekday  pic x(4) comp-5.
       
       procedure division using uncservername passedbuffer 
          net-api-status.
           
           set pp to entry "netapi32"
           call winapi "NetRemoteTOD"
              using function national-of(uncservername)
                    pBuffer
              returning net-api-status
           end-call
           if net-api-status not = 0
              goback
           end-if
           
           set address of buffer to pBuffer
           move buffer to passedbuffer
           if pBuffer not = null
              call winapi "NetApiBufferFree"
                 using pBuffer
              end-call
           end-if
           goback.

View solution in original post

0 Likes
3 Replies
Highlighted
Micro Focus Expert
Micro Focus Expert

You can use the NetRemoteTOD WINAPI function to do this.

The docs can be found here:

A COBOL example of this would be:

       identification division.
       program-id. Program1.

       environment division.
       configuration section.
       special-names.
          call-convention 66 is winapi.
       data division.
       working-storage section.
       01 pp procedure-pointer.
       01 UncServerName pic x(100)
          value z"myservername".
       01 pBuffer       pointer.
       01 net-api-status  pic x(4) comp-5 value 0.
       01 format-date-time.
          05 format-year  pic 9(4).
          05              pic x value "/".
          05 format-month pic 9(2).
          05              pic x value "/".
          05 format-day   pic 9(2).
          05              pic x value space.
          05 format-hours pic 9(2).
          05              pic x value ":".
          05 format-minutes pic 9(2).
          05              pic x value ":".
          05 format-seconds pic 9(2).
          
       linkage section.
       01 Buffer.
          05 tod_elapsedt pic x(4) comp-5.
          05 tod_msecs    pic x(4) comp-5.
          05 tod_hours    pic x(4) comp-5.
          05 tod_mins     pic x(4) comp-5.
          05 tod_secs     pic x(4) comp-5.
          05 tod_hunds    pic x(4) comp-5.
          05 tod_timezone pic s9(9) comp-5.
          05 tod_tinterval pic x(4) comp-5.
          05 tod_day      pic x(4) comp-5.
          05 tod_month    pic x(4) comp-5.
          05 tod_year     pic x(4) comp-5.
          05 tod_weekday  pic x(4) comp-5.
       
       procedure division.

           
           set pp to entry "netapi32"
           call winapi "NetRemoteTOD"
              using function national-of(uncservername)
                    pBuffer
              returning net-api-status
           end-call
           if net-api-status not = 0
              display "error = " net-api-status
              goback
           end-if
           
           set address of buffer to pBuffer
           
           move tod_year to format-year
           move tod_month to format-month
           move tod_day to format-day
           move tod_hours to format-hours
           move tod_mins to format-minutes
           move tod_secs to format-seconds
           display format-date-time
           
           if pBuffer not = null
              call winapi "NetApiBufferFree"
                 using pBuffer
              end-call
           end-if
           goback.

       end program Program1.
0 Likes
Highlighted
Absent Member.
Absent Member.

Hi Chris,

The your example worked in Net Express but two hours forward already in Visual Cobol 2.2 .NET show the following error (attached). It would be the missing of a namespace?

View solution in original post

0 Likes
Highlighted
Micro Focus Expert
Micro Focus Expert

This is a native Windows API function and not a .NET Framework class so when it is being called from managed code P/Invoke.is being used under the covers. The warning you are getting is normal in this situation. Because this is a native WINAPI call I would recommend that you call it from a native COBOL program and then call that program from your managed code in order to get the returned time.

The reason the returned hours may be different than your local time is that the returned value is the UTC (Universal Coordinated Time) of the server, and must be adjusted by TOD_TIMEZONE minutes in order to get the correct local time.

This can be done by converting the time into a DateTime object and then using the ToLocalTime method.

So the managed code project would look something like the following (add a reference to the native .dll)

       identification division.
       program-id. program1.
       data division.
       working-storage section.
       01 UncServerName pic x(100) value z"myserver".
       01 net-api-status  pic x(4) comp-5 value 0.
       01 Buffer.
          05 tod_elapsedt pic x(4) comp-5.
          05 tod_msecs    pic x(4) comp-5.
          05 tod_hours    pic x(4) comp-5.
          05 tod_mins     pic x(4) comp-5.
          05 tod_secs     pic x(4) comp-5.
          05 tod_hunds    pic x(4) comp-5.
          05 tod_timezone pic s9(9) comp-5.
          05 tod_tinterval pic x(4) comp-5.
          05 tod_day      pic x(4) comp-5.
          05 tod_month    pic x(4) comp-5.
          05 tod_year     pic x(4) comp-5.
          05 tod_weekday  pic x(4) comp-5.
       01 localtime type DateTime.
       procedure division.

           call "getnetremotetod" 
              using uncservername
                    buffer
                    net-api-status
           end-call
           if net-api-status not = 0
              display "error = " net-api-status
              goback
           end-if
           
           set localtime to 
              new DateTime(tod_year, tod_month, tod_day, tod_hours, tod_mins, tod_secs, type DateTimeKind::Utc)::ToLocalTime
           
           display localtime
           goback.


and the native code program would look like:

      $set case 
       identification division.
       program-id. getnetremotetod.
       environment division.
       configuration section.
       special-names.
          call-convention 66 is winapi.
       data division.
       working-storage section.
       01 pp procedure-pointer.
       01 pBuffer       pointer.
       linkage section.
       01 UncServerName pic x(100).
       01 passedBuffer.
          05 pb_elapsedt pic x(4) comp-5.
          05 pb_msecs    pic x(4) comp-5.
          05 pb_hours    pic x(4) comp-5.
          05 pb_mins     pic x(4) comp-5.
          05 pb_secs     pic x(4) comp-5.
          05 pb_hunds    pic x(4) comp-5.
          05 pb_timezone pic s9(9) comp-5.
          05 pb_tinterval pic x(4) comp-5.
          05 pb_day      pic x(4) comp-5.
          05 pb_month    pic x(4) comp-5.
          05 pb_year     pic x(4) comp-5.
          05 pb_weekday  pic x(4) comp-5.
       01 net-api-status  pic x(4) comp-5.
       
       01 Buffer.
          05 tod_elapsedt pic x(4) comp-5.
          05 tod_msecs    pic x(4) comp-5.
          05 tod_hours    pic x(4) comp-5.
          05 tod_mins     pic x(4) comp-5.
          05 tod_secs     pic x(4) comp-5.
          05 tod_hunds    pic x(4) comp-5.
          05 tod_timezone pic s9(9) comp-5.
          05 tod_tinterval pic x(4) comp-5.
          05 tod_day      pic x(4) comp-5.
          05 tod_month    pic x(4) comp-5.
          05 tod_year     pic x(4) comp-5.
          05 tod_weekday  pic x(4) comp-5.
       
       procedure division using uncservername passedbuffer 
          net-api-status.
           
           set pp to entry "netapi32"
           call winapi "NetRemoteTOD"
              using function national-of(uncservername)
                    pBuffer
              returning net-api-status
           end-call
           if net-api-status not = 0
              goback
           end-if
           
           set address of buffer to pBuffer
           move buffer to passedbuffer
           if pBuffer not = null
              call winapi "NetApiBufferFree"
                 using pBuffer
              end-call
           end-if
           goback.

View solution in original post

0 Likes
The opinions expressed above are the personal opinions of the authors, not of Micro Focus. By using this site, you accept the Terms of Use and Rules of Participation. Certain versions of content ("Material") accessible here may contain branding from Hewlett-Packard Company (now HP Inc.) and Hewlett Packard Enterprise Company. As of September 1, 2017, the Material is now offered by Micro Focus, a separately owned and operated company. Any reference to the HP and Hewlett Packard Enterprise/HPE marks is historical in nature, and the HP and Hewlett Packard Enterprise/HPE marks are the property of their respective owners.