日期和时间(当地时间而不是UTC)(最大值)

时间:2016-12-19 06:03:19

标签: datetime datetime-format maxima

这些行以UTC表示日期和时间:

t:timedate(absolute_real_time() - (10*3600));
t0:substring(t,1,20);
t1:concat(substring(t,12,17), " ", substring(t,9,11), "/", substring(t,6,8), "/", substring(t,1,5));
t2:concat(substring(t,1,5), substring(t,6,8), substring(t,9,11), substring(t,12,14), substring(t,15,17), substring(t,18,20));

我知道'?\ * autoconf \ -version \ *;'可以给出Maxima版本号,所以也许有一些无证的方式来获取当地时间。

否则有任何可以转换的现成功能 给定夏令时开始/结束条件的UTC时间到当地时间 例如UTC时间到英国时间(GMT / BST取决于一年中的时间)?

3 个答案:

答案 0 :(得分:2)

我不清楚你到底需要什么,但也许以下有帮助。那么,你真的需要提取部件(年,月,日等)吗?如果是这样,直接在Lisp中工作可能会更方便。请参阅Common Lisp Hyperspec的DECODE-UNIVERSAL-TIME(网络搜索会找到它)。

现在timedate(在刚刚发布的Maxima 5.39中)接受一个可选参数,即时区偏移量,以小时为单位(加或减)。时区偏移可以是非整数(例如2.5)。偏移0表示UTC。如果省略偏移量,则将时间格式化为本地时区。

(%i5) t:absolute_real_time();
(%o5)                             3691202499
(%i6) timedate (t, 0);
(%o6)                      2016-12-20 06:01:39+00:00
(%i7) timedate (t);
(%o7)                      2016-12-19 22:01:39-08:00

请注意,夏令时时间标志应用于时间"时间#34;。这是明年夏天夏令时生效的时间。

(%i8) timedate (t + 6*30.25*24*3600);
(%o8)                      2017-06-19 11:01:39-07:00

parse_timedate功能也已(在Maxima 5.39中)更新以识别时区偏移。

(%i9) parse_timedate ("2016-12-19 22:01:39-08:00");
(%o9)                             3691202499

timedate一样,如果省略偏移量,则假定它位于本地时区。

(%i10) parse_timedate ("2016-12-19 22:01:39");
(%o10)                            3691202499

另请注意,Maxima无法识别任何符号时区指示符,例如" UTC"," GMT"," EDT"," America / New_York"等,只有数字时区偏移。

答案 1 :(得分:1)

在揭示解决方案之前澄清问题: 以下是我在Maxima v5.30中采取的步骤 以可读格式获取UTC时间:

注意:当我使用Maxima v5.30(在英国)时, 由于某种未知原因,时间总是UTC调整 10小时,不适用于夏令时。

/* 1st Jan 2017 12 noon: */
timedate(3692260800); /* "2017-01-01 22:00:00+10:00" */
timedate(3692260800-10*3600); /* "2017-01-01 12:00:00+10:00" */
substring(timedate(3692260800-10*3600),1,20); /* "2017-01-01 12:00:00" */

注意:在Maxima的更高版本中,timedate的效果更好/不同, 但有些机构建议安装特定版本的Maxima。

有时我想要表格中的日期:'yyyyMMddHHmmss'。 对此的功能是:

SecUTCToDate(vSec,vHour):=
block([d1,d2],
d1:timedate(vSec+vHour*3600),
d2:concat(substring(d1,1,5), substring(d1,6,8), substring(d1,9,11), substring(d1,12,14), substring(d1,15,17), substring(d1,18,20)),
parse_string(d2)
);

注意:[d1,d2]将这些变量保留在块内,而不是全局变量。

要获得当地时间,我必须根据我的时区(英国为0)和夏令时添加小时数。 要计算时间是否在夏令时期间,每个时区需要一个单独的功能:在英国和许多欧洲国家,一个这样的功能是:

/* correct for the years 1900-2200 inclusive */
SecUTCIsDSTUK(vSec):=
block([vLeap,vDaysMar25,vDaysOct25,vWDayMar25,vWDayOct25,vRange1,vRange2],
vYear : parse_string(substring(timedate(vSec),1,5)),
vLeap : floor((vYear-1900)/4), if (vYear>=2100) then vLeap : vLeap-1,
vDaysMar25 : (vYear-1900)*365 + vLeap + 83,
vDaysOct25 : vDaysMar25 + 214,
vWDayMar25 : mod(vDaysMar25+1,7),
vWDayOct25 : mod(vDaysOct25+1,7),
vRange1 : (vDaysMar25+mod(-vWDayMar25,7))*86400 + 3600,
vRange2 : (vDaysOct25+mod(-vWDayOct25,7))*86400 + 3600,
if ((vSec >= vRange1) and (vSec < vRange2)) then 1 else 0);

您可以使用这样的功能创建一个mac文件,并在需要时调用该函数,例如:

load("C:\\MyFolder\\MyFile.mac");
SecUTCIsDSTUK(absolute_real_time());
SecUTCIsDSTUK(absolute_real_time()+86400*180);

答案 2 :(得分:0)

感谢您的回复,

结果(v.5.39.0)(工作正常,param 2省略给出本地时间,param 2为0给UTC):

t:3691202499;
timedate (t);
timedate (t + 6*30.25*24*3600);
timedate (t + 6*30*24*3600);
timedate (t, 0);
timedate (t + 6*30.25*24*3600, 0);
timedate (t + 6*30*24*3600, 0);
:lisp (decode-universal-time 3691202499)
:lisp (decode-universal-time 3691202499 0)
:lisp (decode-universal-time 3706754499)
:lisp (decode-universal-time 3706754499 0)

3691202499
"2016-12-20 06:01:39+00:00"
"2017-06-19 19:01:39+01:00"
"2017-06-18 07:01:39+01:00"
"2016-12-20 06:01:39+00:00"
"2017-06-19 18:01:39+00:00"
"2017-06-18 06:01:39+00:00"
39 1 6 20 12 2016 1 NIL 0
39 1 6 20 12 2016 1 NIL 0
39 1 7 18 6 2017 6 T 0
39 1 6 18 6 2017 6 NIL 0

结果(v.5.30.0)(似乎param 2省略了UTC + 10,没有夏令时):
(如果这是真的,我必须找到另一种获取本地时间的方法,可能是通过Common LISP命令)

t:3691202499;
timedate (t);
timedate (t + 6*30.25*24*3600);
timedate (t + 6*30*24*3600);
:lisp (decode-universal-time 3691202499)
:lisp (decode-universal-time 3691202499 0)
:lisp (decode-universal-time 3706754499)
:lisp (decode-universal-time 3706754499 0)

3691202499
"2016-12-20 16:01:39+10:00"
"2017-06-20 04:01:39.0+10:00"
"2017-06-18 16:01:39+10:00"
39 1 16 20 12 2016 1 NIL -10
39 1 6 20 12 2016 1 NIL 0
39 1 16 18 6 2017 6 NIL -10
39 1 6 18 6 2017 6 NIL 0

(我可以看到timedate和decode-universal-time函数 Maxima版本之间存在关键差异)

谢谢你提到的网站,
CLHS:环境词典章节 http://clhs.lisp.se/Body/c_enviro.htm

是否有一个在Maxima中有效的LISP命令列表?

日期戳关注的主要原因:
生成文件名的日期戳,例如&#39; z title yyyymmddhhmmss.txt&#39;, 或者对于那些文件中的友好日期,例如&#39; hh:mm dd / mm / yyyy&#39;, 字符串操作方法是最简单的方法 我可以成功编码(我不明确需要提取个人等)