在UniVerse 11.2.4+中是否有本地方式转换为UTC时间?

时间:2015-06-09 15:59:13

标签: universe u2 rocket-u2

UniVerse版本11.2.4的发行说明提到了本地时区配置,但它是在审计的上下文中。这是引用:

  

本地时区配置

     

在UniVerse 11.2.4之前,审核日志记录中存储的日期和时间数据仅基于UTC。   从UniVerse 11.2.4开始,UniVerse添加了日期和时间数据   根据本地时区审核日志记录。数据存储在   每个记录的位置19。此数据字段的字典名称   是TZINFO。有关更多信息,请参阅UniVerse安全功能。

由于UniVerse似乎能够在本地使用时区,这是否意味着可能有一种方法可以根据我的EST / EDT值轻松生成UTC格式的日期/时间戳?

我将数据发送到希望日期格式为ISO-8601日期/时间格式yyyy-MMddTHH:mm:ssZ的系统,如2015-06-02T15:55:22Z,并考虑时区和夏令时偏移。

我挖掘了安全功能指南,发现了这个:

  

UniVerse还添加了一个全球编目计划,以帮助用户   从审计日志中获取日期和时间信息(称为   通过以上两个I描述符字段):

SUBROUTINE GETLOCALTIME
(
RESULT ;* OUT: output
TZOFF ;* IN: time zone offset
DATE ;* IN: UTC date
TIME ;* IN: UTC time
OP ;* IN: operation
;* 1: get local date
;* 2: get local time
;* 3: get local timezone id
;* 4: get local timezone daylight saving flag
)

(由于我没有使用UniVerse的审核功能,我不认为我可以做很多事情,也不能找到子程序。)

我还使用了热门的(?)DATE.UTILITY program from PickWiki,但其夏令时开始/结束日期的计算似乎已关闭。我会将这些问题保存为另一个问题。

这是啰嗦,但我希望有人可以指出我正确的方向,如果有新的OCONV()参数或我可以使用的东西。

万一重要,我在Windows Server 2008 R2上运行。

谢谢!

2 个答案:

答案 0 :(得分:0)

时间是一件复杂的事情。在社交方面,我们已经接受了,每年改变它2次不仅可以接受,我们已经强制要求!这对我们这些只想在我们方便的时候理解时间的肉类机器来说一切都很好,但是当它报告“看起来很有趣”时它会让我们变得脾气暴躁。

您的问题的解决方案并不是特别容易,特别是如果您正在处理已记录的日期。宇宙中的日期和时间通常基于本地系统时间记录。如果您正在尝试继续这样做,那么您必须记下交易时的偏移量,或者简单地标记SYSTEM(99),这几乎使您需要做的所有其他报告变得复杂。无论哪种方式,这都是一个复杂的问题,它仍然可能有点不完美。

如果您是负责记录日期的人,可以帮助您。

SECONDS.SINCE.GMT.01.01.1970 = SYSTEM(99) 
CRT SECONDS.SINCE.GMT.01.01.1970:" Seconds since GMT Epoch Began"

NUMBER.OF.DAYS.SINCE.01.01.1970 = DATE() -732 
;* Day 0 in Pick is 12/31/1967 because Dick Pick so we subtract 732 from the pick date

SECONDS.SINCE.MIDNIGHT.LOCAL= TIME()
SECS.PER.DAY = 24 * 60 * 60
LOCAL.SECONDS.SINCE.GMT.01.01.1970 = NUMBER.OF.DAYS.SINCE.01.01.1970 * SECS.PER.DAY + FIELD(SECONDS.SINCE.MIDNIGHT.LOCAL,".",1) 
;*I drop the precision
CRT LOCAL.SECONDS.SINCE.GMT.01.01.1970: " Seconds since 01/01/1970 in local time"

OFFSET = (LOCAL.SECONDS.SINCE.GMT.01.01.1970 - SECONDS.SINCE.GMT.01.01.1970)
CRT "CURRENT.OFFSET IS ":INT((OFFSET / 60 )/ 60)
END

在我的系统上输出以下内容,当前是PDT(即使OCONV(DATE(),'DZ')将其报告为PST。

1434472817 Seconds since GMT Epoch Began
1434447617 Seconds since 01/01/1970 in local time
CURRENT.OFFSET IS -7

希望您发现这有用。

答案 1 :(得分:0)

感谢您的线索。这是我的实施:

  SUBROUTINE FORMAT.ISO.8601 (IDATE, ITIME, RESULT, ERR.TEXT)

  * Don't step on the caller's variables.
  IN.DATE = IDATE
  IN.TIME = ITIME

  * Initialize the outbound variable.
  RESULT = ''

  IF NOT(NUM(IN.DATE)) THEN
     ERR.TEXT = 'Non-numeric internal date ' : DQUOTE(IN.DATE) : ' when numeric required.'
     RETURN
  END

  IF NOT(NUM(IN.DATE)) THEN
     ERR.TEXT = 'Non-numeric internal time ' : DQUOTE(IN.TIME) : ' when numeric required.'
     RETURN
  END

  * SYSTEM(99) is based on 1/1/1970.
  SECONDS.SINCE.GMT.01.01.1970 = SYSTEM(99)

  * Day 0 in Pick is 12/31/1967
  * Subtract 732 to equalize the starting dates.
  NUMBER.OF.DAYS.SINCE.01.01.1970 = DATE() - 732

  SECONDS.SINCE.MIDNIGHT.LOCAL= TIME()
  SECS.PER.DAY = 24 * 60 * 60
  LOCAL.SECONDS.SINCE.GMT.01.01.1970 = NUMBER.OF.DAYS.SINCE.01.01.1970 * SECS.PER.DAY + FIELD(SECONDS.SINCE.MIDNIGHT.LOCAL,".",1)

  OFFSET = LOCAL.SECONDS.SINCE.GMT.01.01.1970 - SECONDS.SINCE.GMT.01.01.1970

  OFFSET = INT((OFFSET / 60 )/ 60)

  OTIME = OCONV(IN.TIME, 'MTS')
  IF OTIME = '' THEN
     ERR.TEXT = 'Bad internal time ' : DQUOTE(IN.TIME) : '.'
     RETURN
  END

  HOURS = FIELD(OTIME, ':', 1)
  MINUTES = FIELD(OTIME, ':', 2)
  SECONDS = FIELD(OTIME, ':', 3)

  HOURS -= OFFSET
  IF HOURS >= 24 THEN
     IN.DATE += 1
     HOURS = HOURS - 24
  END
  HOURS = HOURS 'R%2'

  ODATE = OCONV(IN.DATE, 'D4/')
  IF ODATE = '' THEN
     ERR.TEXT = 'Bad internal date ' : DQUOTE(IN.DATE) : '.'
     RETURN
  END

  DMONTH = FIELD(ODATE, '/', 1)
  DDAY = FIELD(ODATE, '/',2)
  DYEAR = FIELD(ODATE, '/',3)

  RESULT = DYEAR : '-' : DMONTH : '-' : DDAY : 'T' : HOURS : ':' : MINUTES : ':' : SECONDS : 'Z'

  RETURN

END

这是我的测试工具:

  CRT 'Testing right now.'
  IDATE = DATE()
  ITIME = TIME()
  CALL FORMAT.ISO.8601 (IDATE, ITIME, RESULT, ERR.TEXT)
  IF ERR.TEXT THEN
     CRT 'ERR.TEXT: ' : ERR.TEXT
  END ELSE
     CRT 'RESULT: ' : RESULT
  END

  CRT
  CRT 'Testing an hour ago.'
  IDATE = DATE()
  ITIME = TIME()
  ITIME = ITIME - (60*60)
  IF ITIME < 0 THEN
     ITIME += (24*60*60)
     IDATE -= 1
  END
  CALL FORMAT.ISO.8601 (IDATE, ITIME, RESULT, ERR.TEXT)
  IF ERR.TEXT THEN
     CRT 'ERR.TEXT: ' : ERR.TEXT
  END ELSE
     CRT 'RESULT: ' : RESULT
  END

  CRT
  CRT 'Testing an hour from now.'
  IDATE = DATE()
  ITIME = TIME()
  ITIME = ITIME + (60*60)
  IF ITIME > (24*60*60) THEN
     ITIME -= (24*60*60)
     IDATE += 1
  END
  CALL FORMAT.ISO.8601 (IDATE, ITIME, RESULT, ERR.TEXT)
  IF ERR.TEXT THEN
     CRT 'ERR.TEXT: ' : ERR.TEXT
  END ELSE
     CRT 'RESULT: ' : RESULT
  END

END

这是我的测试运行:

  >T$FORMAT.ISO.8601
  Testing right now.
  RESULT: 2017-03-29T00:47:22Z

  Testing an hour ago.
  RESULT: 2017-03-28T23:47:22Z

  Testing an hour from now.
  RESULT: 2017-03-29T01:47:22Z