当您从 active server page (asp) 中使用
now 、
date 或
time 函数时,时间和日期的格式根据模拟用户、身份验证用户、登录用户以及服务器上操作系统版本等参数的不同而有所不同。
备注:除非您特地模拟某一用户,否则模拟用户与身份验证用户相同。此外,登录用户是指登录服务器的用户。
根据客户要求,从系统中读取区域设置的方式(主要是日期/时间格式)已经在操作系统的最近版本中做出更改,以便为开发人员提供对此功能的更多控制。
虽然区域设置在上述的各个操作系统(除 windows nt 4.0 之外)中的功能有所不同,但它们具有一项共同的行为特征:当没有人实际登录系统时,区域设置在所有操作系统版本中具有相同的功能。
从 asp 中访问时的日期/时间格式化方式
iis 4.0 (windows nt 4.0)
当没有人实际登录服务器时,iis 从系统默认设置中(尤其是从 locale.nls 文件中)读取日期/时间格式(和其他区域设置)。您可以在"控制面板"的"区域设置"部分更改此设置,更改之后必须重新启动计算机。
当有人登录计算机时,iis 会读取登录用户的区域设置。这些设置从
hkey_current_user/control panel/international 注册表配置单元中的用户配置文件设置中读取。您可以在"控制面板"的"区域设置"部分更改此设置,更改之后必须重新启动计算机。
iis 5.0(windows 2000 和 windows 2000 service pack 1)
在操作系统安装过程中,将在系统注册表的
hkey_users/.default/control panel/international 配置单元中指定并写入区域设置选项。
通常,当显示日期/时间的 asp 页得到请求时,iis 将首先确定注册表中是否已加载身份验证用户的配置文件。如果已加载,iis 将读取该用户配置文件的区域设置 id,然后在 iis 高速缓存中进行查找(如果此区域设置的区域设置已缓存)。如果被缓存,iis 将用缓存的格式为请求提供服务。如果没有在缓存值中找到该区域设置,则从
hkey_current_user/control panel/international 注册表配置单元中该用户的配置文件设置中读取日期/时间格式。信息随即被缓存,而 iis 将显示具有所缓存日期/时间格式的 asp 页。
如果身份验证用户没有用户配置文件,iis 将从系统默认设置中读取区域设置 id,然后在缓存的区域设置中查找该区域设置。如果找到缓存值,iis 将用缓存的格式为请求提供服务;否则,iis 将从
hkey_users/.default/control panel/international 注册表配置单元中的系统默认设置中读取该格式。信息随即被缓存,而 iis 将显示具有所缓存日期/时间格式的 asp 页。
但是,此逻辑存在问题。对于每一个请求,iis 将检查是否为结果区域设置 id 缓存了日期/时间格式。如果 iis 找到缓存的格式,就会使用它。如果首次浏览到该页的用户的区域设置 id 与要用于 asp 页的预期区域设置 id 相同,但它们的日期格式不同于要用于 asp 页的预期日期格式,则会出现问题。在这种情况下,该区域设置 id 的缓存日期格式具有错误的格式,并且将向请求该页的其余用户提供。
当没有用户实际登录服务器时,iis 将从上述注册表位置读取日期/时间格式以及其他区域设置,而不像在 windows nt 4.0 中一样从 locale.nls 文件中读取。
iis 5.0(windows 2000 service pack 2 和更高版本)
在 windows 2000 service pack 2 (sp2) 中,默认行为如以上所述。但是,您也可以自定义设置:您可以更改基 oleaut 组件,也可以更改 iis 使其允许在 oleaut 中进行此更改。
您可以在全局设置 oleaut 的注册表项。这不会重写通过使用公开的调用来显式设置该选项的进程。因此,如果您设置以下 iis 值,则将重写 oleaut 设置。
hkey_local_machine\software\microsoft\oleaut
varconversionlocalesetting = 0,1,2 (dword)
备注:oleaut 项可能不存在。如果它不存在,则必须先创建该项。
您也可以设置 iis 的值,它也会重写 oleaut 的任何全局设置。此外,无论是否设置该注册表项,iis 都将调用此 oleaut 应用程序编程接口 (api)。
hkey_local_machine\system\currentcontrolset\services\inetinfo\parameters
setvarconversionlocalesetting = 0,1,2 (dword)
值 0、1 和 2 对于 oleaut 和 iis 都相同,其定义如下:
•
0 - 默认行为,如以上所述。此格式完全是随机的。它基于设置高速缓存的最后用户或进程。
•
1 - 此格式基于请求这些值(调用 oleaut32.dll 文件)的线程的当前标识。在 iis 中,这是身份验证用户配置文件设置,因为 iis 在默认情况下模拟身份验证用户。如果身份验证用户的配置文件不存在或者未加载到注册表中,它将默认为
hkey_users\.default\control panel\international 注册表配置单元中的系统默认设置。
您可以如此配置 web 应用程序:请求这些格式的线程上的模拟用户可以始终是相同的用户;这样,您可以建立一致的格式。例如,如果您在 asp 页上使用模拟访问,则无论谁登录系统,也无论哪一个实际用户请求该页,都将返回相同的日期格式。
•
2 - 此格式强制为使用系统默认的区域设置。系统默认设置在重新启动时为计算机设置。若要修改默认系统设置,请选择新的区域设置,然后单击控制面板上的"区域设置"工具中的
设置默认值。您必须重新启动计算机,以使此更改生效。在这种情况下,日期格式不是从注册表中读取的,而是从该区域设置的 locale.nls 文件中读取的。
备注:当更改默认区域设置时,将更改所有区域设置(货币、时间、日期等)。无法修改区域设置中的特定设置。
iis 5.0 (asp.net)
基本行为和基本原则在 asp.net 中保持不变。例如,对
response.write(now()) 和
response.write(date()) 函数的调用仍像在该操作系统的传统 asp 中一样工作。但是,asp.net 中有特殊的格式函数来格式化日期/时间和其他区域性信息。有关更多信息,请参见
cultureinfo、
regioninfo 和
system.globalization 命名空间的 msdn 文档。
相关信息
如果您需要的区域设置日期/时间格式不同于系统默认区域设置,则最好在 asp 页中使用以下代码来设置格式:
<% session.lcid=2058
'or use the vbscript setlocale function to set the locale.
response.write formatdatetime( now(), 2)
'the constant 2 is for obtaining the vbshortdate.
%>
本文主要侧重于日期/时间格式。由于 iis 缓存日期/时间格式的方式,区域设置的其余部分可能与日期/时间格式表现出不同的行为。例如,货币格式也取决于区域设置,但遵循用"iis 5.0(windows 2000 service pack 2 和更高版本"节中的设置 1 所指定的逻辑。
从服务(如 internet 信息服务 (iis))访问日期/时间格式的方式不同于其他独立进程(非服务)访问日期/时间格式的方式。通常,独立程序的区域设置从应用程序启动用户的用户配置文件中进行访问,该用户通常与登录用户具有相同的帐户。
由于服务甚至在没有人登录计算机时也会运行,因此必须通过某种方式在没有用户登录计算机时检索区域设置。hkey_users/.default/control panel/international 注册表配置单元中的系统默认设置可以检索区域设置。
访问这些区域设置的方式在有人登录系统时取决于某些参数,而这些行为对于不同的操作系统将有所不同。