第九章 时间处理

第九章  时间处理

译自 《TangoRefMan_Sep_1_2008.odt


注意:0.99.3版后,时间系统已经改变,如果使用0.99.3或更早的Tango库,请看原始文档。
时间单位对于人类的重要性正如位和字节对于计算机的重要性。我们居家、旅行、日常生活都要用到时间。出于这个原因,tango.time包收集所有的时间细节和日期详情到一个合适的模块中,谨慎地抽象去掉所有平台的细节。


TimeSpan(时间跨度)


时间跨度的基本描述在tango库的tango.time.TimeSpan模块中。这个概念描述的时间长度有能力描述一个+/-10000年的周期,以100纳秒递增(叫做ticks)。时间跨度TimeSpan概念被看作一个基本类型,它提供所有实用的操作重载,可以方便地转换TimeSpan到通用的计量单位如秒和毫秒。
TimeSpan模块包含大多数时间长度的构造器,构造器以计量单位命名。如创建一个描述5秒的时间跨度:


TimeSpan t =TimeSpan.seconds(5);


TimeSpan模块也包含为数众多的常量帮助操作描述ticks的值,你将会常常用到这些常量,将来的tango版本会有一个不同的重新解决方法给tick,这些常量被命名为TimeSpan.TicksPerⅩ,这里的Ⅹ是秒、毫秒等等。


如创建一个描述5秒的时间跨度:


TimeSpan t = TimeSpan(TimeSpan.TicksPerSecond*5);

 


转换TimeSpan 到一个确凿的时间单位,使用时间单位命名的属性


//获取TimeSpan t描述的秒数
long s = t.seconds;


注意,这样将执行整数分割,将截短任何不完整的秒数。


Time和TimeOfDay


基本的时刻表示在tango.time.Time模块中,这个结构允许表示的时刻范围从10000BC(公元前)到10000AD(公元)。Time中的分隔时间单位也是100纳秒。Time使用TimeSpan去返回两个时间值的不同点,与及加减一个时间长度,它也被clock类和calendar类使用去提供本地时间刻度。
TimeOfDay结构在tango.time.TimeSpan中,用于表示一个给定日子没有日期的时间如:12:42:32.这个结构与TimeSpan有点像,不同的是它的属性返回一个时间部分,而不是转换总时间成时间单位,但TimeOfDay.seconds通常返回一个0-59之间的值。TimeOfDay可以从一个给定时间用时间属性去访问:


import tango.io.Stdout;
import tango.time.WallClock;
void nain()
{
TimeOfDay  tod =WallClock.now.time;
Stdout.format(“time is {}:{:d02}:{:d02}”,
tod.hours,tod.minutes,tod.seconds).newline;
}


Clock、WallClock和DateTime


tango.time.Clock和WallClock模块分别表示UTC和本地时间。Clock和WallClock有类似的函数。


Clock有如下三个意图:
1.抽象分离系统级时间函数。
2.揭示一个简单、灵活、一致的时间表达式,表示UTC时间和本地时间。
3.初始化用户易使用的时间域,带有原生时间信息,因此每个时间部分容易独立访问。


取回一个时钟Clock的当前值可以通过now方法,返回一个Time值,此值可以分割成表示时间部分的域,或使用TimeSpan结构操作。
示例:


import tango.time.Clock;
void main ( )
{
Time time = Clock.now;
}


使用Clocks更多地围绕访问时间“域”(fields)去获取或设置时间属性。初始化时间域我们使用Clock.toDate或WallClock.toDate去创建一个DateTime结构获取UTC或本地时间。


import tango.time.Clock;
void main ( )
{
auto fields = Clock.toDate;
}


这里,我们用当前UTC时间设置datetime域。也可以类似地调用WallClock.toDate代替,在这种情况下,所有域值被本地时间代替。有时转换当前域时间值到一个原子形式(一个简单的Time值。)是必要的。fromDate是用于这种目的的方法,它返回它返回当前域内容的时间值。
现在,哉变量被初始化为时间值,我们可以很好的使用它们:


import tango.time.Stdout;
import tango.time.WallClock;
void main ( )
{
auto fields = WallClock.toDate;
Stdout.format(”{}{}{},{}{:D2}{:D2}{:D2}”,
fields.date.asDay,
fields.date.asMonth,
fields.date.day,
fields.date.year,
fields.time.hours,
Fields.minutes,
fields..time.seconds);
}


这些域提供给我们方便地访问当前时间的所有方面。属性.asDay返回一个表示当前星期几的名字,asMonth返回表示月份名的字符串day、year、hours、minutes、seconds分别返回表示该部分的整数值。引用milis域时将获得尽可能准确的当前时间的毫秒值。


WallClock也允许我们用zone方法取得时区信息。调用此方法取得表示格林尼治(Green wich Mean Time)时间的当前时区的TimeSpan值,负值表示west of GMT。


StopWatch


StopWatch模块展示一个简单的start/stop API,在win32平台有非常高的精确度。


Calendar (日历)


时间值是日历未知,所有日历基于传统的秒和小时的概念,和日常使用的时间概念相同。不过,在年、月和一个月中的日期部分就有了一些出入。一个日历变体提供转换日期和时间部分到一个时间值的可能性,或给予访问者一Time结构的日期部分。例如:


import tango.time.Stdout;
import tango.time.WallClock;
import tango.time.chrono.Gregorian;
void main ( )
{
auto n = WallClock.now;
auto t = n.time;
auto d = Gregorian.generic.toDate(n);
Stdout.format(“date/time is {}/{}/{} {} : {:d2}: {:d2} “,
d.day,d.month,d.year,t.hour,t.minutes,t.seconds).newline;
}


构造一个时间结构从一个给定的日期和时间用getTime方法:


Time arbitraryTime = cal.getTime(2006,11,18,10,52,33,0);


为了方便,有一个模块在tango.time.chrono称为DefaultCalendar,此模块包含一个简单日历实例叫做DefaultCalendar。默认是Gregorian日历,但你可以改变它到你想改变的任何日历。


Daylight Savings time 夏令时间(DST)


所有时区和夏令时间计算隔离在WallClock中,在UTC和Wall-time间互相转换,按照适当的操作系统便利被执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值