Visual Studio在不同时区中的敏捷开发

时间:2022-02-25 10:12:08

Visual Studio在不同时区中的敏捷开发

VS在很多方面都体现了敏捷开发的理念,而敏捷开发中有一个很重要的原则,即同一个软件模型能够适应环境的变化。简单的说就是软件的灵活性。如果针对不同的环境参数,要单独开发就算不上敏捷了。笔者这里就以时区为例,谈谈敏捷开发在VS中的表现。

众所周知,现在软件的应用范围越来越广,而“时间”是任何一款系统中必要的参数,不同的国家所采用的时区是不同的。这就给软件的设计带来了一定的困扰。如现在有一家公司,在中国与美国都有分支机构。总公司需要对两家分支机构的记录进行汇总,并按时间进行排序,此时由于两地分支机构所采用的时区不同,排序就会遇到问题。

VS在时区支持上的改进

在以前,对于不同时区的时间字段进行排序是比较麻烦的一件事情。如可能需要先进行转换等等。甚至需要为不同的时区单独设置处理模块。无疑这不符合敏捷开发的原则。为了改善这种情况,在VS2008中提供了两种新型的日期类型DateTimeOffset和TimeZoneInfo。这两种日期类型的数据改善了对时区的支持。有了它们,开发人员可以更加容易、便捷的开发使用不同时区中的日期和时间的应用程序。也就是说,不同时区中的时间和日期可以进行相互对比了。

TimeZoneInfo日期类型使用技巧

TimeZoneInfo顾名思义,这个数据类型主要用来表示时区。注意虽然TimeZone这个数据类型也可以表示时区,但是TimeZoneInfo在功能上要比TimeZone要强大。如TimeZone只能够识别本地时区(注意其也可以在世界协调时和本地时间之间进行转换);而TimeZoneInfo则可以表示任意时区,并且这个时区对应的方法可用于将一个时区的时间转换为其他任意时区的相应时间。具体的说,TimeZoneInfo数据类型可以进行如下的操作。

1.可以在不同时区之间进行自由的转换

如上面这个例子,不同时区的记录有时候需要相互比较,此时就需要先将记录中的时间根据时区来进行转换。这就好像是单位之间的转换一样。不同的单位之间的值没有可比性,不同时区的日期也没有可比性。通过一定的规则,将它们转换为相同的单位或者时区,然后再进行对比。

2.枚举系统上可用的时区或者检索操作系统已经定义的时区

有时候数据库管理人员可能需要知道,现在数据库中使用的时区有多少个。一般来说,本地时区,即默认时区只有一个。在数据库合并的时候,这个枚举或者检索的功能非常有用。如:现在美国办事处、日本办事处、中国办事处等等,各有几万条记录。现在要将它们合并。在合并之前数据库管理员必须要了解时区信息。否则,时间等信息将没有参考的价值。如果管理员需要知道本地时区,则可以使用这个数据类型的Local属性。即可以通过TimeZoneInfo.local的方法来直接访问本地时区。

3.TimeZone与TimeZoneInfo之间的差异

这两个数据类型都可以用来表示时区。如果前者功能受到一定的限制,如:虽然前者也可以在本地时区与世界协调时之间进行转换。但是无法在任意时区之间进行转换。如现在可能有中国数据库和日本数据库中的数据。他们两个属于不同的时区。在对他们的内容进行排序的时候,就需要将它们的时间全部调整到世界协调时,然后再进行排序。而不能够将日本的时区调整到中国的时区。因为它们之间不能够转换。而如果采用了TimeZoneInfo这个数据类型,则不同时区之间可以相互转换。如上面这个案例中,直接可以将日本时区的时间信息转换为中国时区的时间信息,然后进行排序。而不用再转换为世界协调时。由于中间少了一个转换的环节,其效率也会提高不少。

DateTimeOffset日期类型使用技巧

简单的说,这个时间类型的数据表示一个时间点,通常以相对于协调世界时的日期和时间来表示。注意这个日期类型的名字比较有意思,代表了这个数据类型的特点。这个数据类型其实有两个部分组成:DateTime与Offset。其中DateTime跟普通的日期型数据一样,其表示当前实例中所设置的时区的日期。而Offset则表示与协调世界时之间的差值。如果将它们两个数字进行相加,那么得到的就是协调世界时。设想一下,如果现在有两条记录,分别是属于不同时区的系统所创建的。现在如果要比较它们创建的先后顺序(即按照时间来排序),如果直接根据Datetime的值来比较,肯定是不行的。在这种情况下,系统就会参考Offset的值,先将其转换为世界协调时,然后再进行比较。此时得到的结果显然是比较合理的。

DatetimeOffset类型的值包含一个偏移量,所以跟普通的日期类型有所不同。在操作与功能上也有不少的差异。在这里笔者就将其常用的操作及注意事项做一个说明,供大家参考。

一是日期和时间的提取与处理操作。在Datetime数据类型中包括年、月、日、小时、分、秒等等信息。开发人员可以根据需要任意提取所需要的内容,如月份或者日期等等。在DatetimeOffset数据类型的值中,也包含了这些信息。为此开发人员仍然可以根据需要来提取这个数据类型值的日期或者时间信息。也可以检索特定的DateTimeOffset组成部分的值。这一部分的操作跟DateTime数据类型完全相同。

二是可以对这个日期类型的数据进行运算。如:可以基于这个数据类型的值来计算出几天以后的日期,或者是对两个日期进行减法运算,以计算出两个日期相隔的天数(即Date1-Date2)。从表面上看,这个好像跟Datetime没有不同。其实本质上有所差异。DatetimeOffset在计算的时候,会针对时间偏移量进行比较。也就是说,考虑不同时区的内容。如现在有两个时间,分别为8点与9点。如果它们是Datetime类型,进行减法运算,最后的差异就只有1个小时。但是如果这个两个时间分别属于不同的时区。在计算的时候考虑到时区,则最好的结果就不是1个小时了。总之,DatetimeOffset数据类型在进行加减运算的时候,会考虑偏移量,即时区的信息。

三是DatetimeOffset与Datetime两种日期型的数据可以进行相互转换。如现在中国有家公司在美国设置了一个办事处。月底的时候要将美国办事处的业务与国内的进行汇总。此时就需要将国外办事处的时间(DatetimeOffset类型)的转换为国内的时间(Datetime类型)。这是可以的。如果要反向转换也可行。也就是说,它们两个数据类型可以相互转换,就好像在特定条件下字符型与数字型的数据可以相互转换一样。

另外,DatetimeOffset类型的数据还可以相互比较、日期和时间转换等等操作。其原理跟Datetime数据类型相同。只是在对其进行操作的时候,考虑了具体的时区。当需要对不同时区的记录进行排序、比较等等,笔者建议采用DatetimeOffset这个数据类型,可以消除因为时区不同而带来的不便之处。

从以上分析中可以看出,这两个跟日期有关的数据类型主要的作用就是提高了应用程序在不同的国家(不同时区)下的应用能力,为应用程序的集成提供了方便,提高了应用程序的灵活性。这也正是敏捷开发的一个体现。

上一篇:够用就好,教你宽带路由器如何选等 下一篇:存储高手速成:磁盘阵列概念七问七答