此代码不提供答案,但它可能有助于找到您的问题。
代码太大,无法评论。
请执行这个程序。输出是什么?哪里失败了?
static void Main(string[] args)
{
Console.WriteLine("OracleGlobalization.TimeZone = {0}", Oracle.DataAccess.Client.OracleGlobalization.GetClientInfo().TimeZone);
Console.WriteLine(String.Empty);
Console.WriteLine("TimeZone.CurrentTimeZone.StandardName = {0}", TimeZone.CurrentTimeZone.StandardName);
Console.WriteLine("TimeZone.CurrentTimeZone.DaylightName = {0}", TimeZone.CurrentTimeZone.DaylightName);
Console.WriteLine(String.Empty);
Console.WriteLine("TimeZoneInfo.Local.DisplayName = {0}", TimeZoneInfo.Local.DisplayName);
Console.WriteLine("TimeZoneInfo.Local.Id = {0}", TimeZoneInfo.Local.Id);
Console.WriteLine("TimeZoneInfo.Local.StandardName = {0}", TimeZoneInfo.Local.StandardName);
Console.WriteLine("TimeZoneInfo.Local.DaylightName = {0}", TimeZoneInfo.Local.DaylightName);
Console.WriteLine(String.Empty);
var str = new Oracle.DataAccess.Client.OracleConnectionStringBuilder();
str.UserID = "<username>";
str.Password = "<password>";
str.DataSource = "<database name>";
using ( var con = new Oracle.DataAccess.Client.OracleConnection(str.ConnectionString) ) {
con.Open();
Console.WriteLine("Oracle.DataAccess: OracleConnection -> SessionInfo.TimeZone = {0}", con.GetSessionInfo().TimeZone);
Console.WriteLine("Oracle.DataAccess: Version = {0}", FileVersionInfo.GetVersionInfo(con.GetType().Assembly.Location).FileVersion.ToString());
var tz = new Oracle.DataAccess.Client.OracleCommand("SELECT SESSIONTIMEZONE FROM dual", con).ExecuteScalar();
Console.WriteLine("Oracle.DataAccess: SESSIONTIMEZONE = {0}", tz.ToString());
con.Close();
}
Console.WriteLine(String.Empty);
var strm = new Oracle.ManagedDataAccess.Client.OracleConnectionStringBuilder();
str.UserID = "<username>";
str.Password = "<password>";
str.DataSource = "<database name>";
using ( var con = new Oracle.ManagedDataAccess.Client.OracleConnection(str.ConnectionString) ) {
con.Open();
Console.WriteLine("Oracle.ManagedDataAccess: OracleConnection -> SessionInfo.TimeZone = {0}", con.GetSessionInfo().TimeZone);
Console.WriteLine("Oracle.ManagedDataAccess: Version = {0}", FileVersionInfo.GetVersionInfo(con.GetType().Assembly.Location).FileVersion.ToString());
var tz = new Oracle.ManagedDataAccess.Client.OracleCommand("SELECT SESSIONTIMEZONE FROM dual", con).ExecuteScalar();
Console.WriteLine("Oracle.ManagedDataAccess: SESSIONTIMEZONE = {0}", tz.ToString());
con.Close();
}
}
更新
根据您的个人资料,您在斯里兰卡。斯里兰卡的时区似乎相当“不稳定”,见IANA TimeZone Database的文字:
斯里兰卡
来自保罗·埃格特(2013-02-21):
米尔恩说“马德拉斯的平均时间从 1898 年 5 月 1 日开始使用。在此之前科伦坡
平均时间,5 小时。 4米。 21.9 秒。 F., 被使用了。”但是 5:04:21.9 差别很大
来自科伦坡的子午线 5:19:24,所以现在忽略 Milne 并坚持
香克斯和波滕格。
来自 Paul Eggert (1996-09-03):
“斯里兰卡将时钟提前一小时以避免停电”
(http://www.virtual-pc.com/lankaweb/news/items/240596-2.html, 1996-05-24,
自 1999 年 8 月 17 日起不再可用)
报道称“国家标准时间将提前一小时
“鉴于当前的电力危机”,周五午夜(格林威治标准时间 1830 年)。”
引自斯里兰卡媒体部长 Dharmasiri Senanayake (1996-10-24)
通过 Shamindra 在每日新闻 - 热门新闻部分
(1996-10-26):
自 1996 年 10 月 26 日凌晨 12 时 30 分起生效
斯里兰卡将比格林威治标准时间早六 (06) 小时。
来自 Jesper Nørgaard Welen (2006-04-14),引用斯里兰卡新闻在线
http://news.sinhalaya.com/wmview.php?ArtID=11002 (2006-04-13):
2006 年 4 月 15 日 0030 时(2006 年 4 月 14 日午夜 +30 分钟)
目前,变为 2006 年 4 月 14 日(2006 年 4 月 14 日午夜)的 2400 小时。
来自路透社的 Peter Apps 和 Ranga Sirila (2006-04-12):
http://today.reuters.co.uk/news/newsArticle.aspx?type=scienceNews&storyID=2006-04-12T172228Z_01_COL295762_RTRIDST_0_SCIENCE-SRILANKA-TIME-DC.XML
[泰米尔猛虎队] 从未接受最初的 1996 年时间更改,只是简单地
让他们的时钟比格林威治标准时间早五个半小时
时间 (GMT),与邻国印度一致。
来自 Paul Eggert (2006-04-18):
居住在泰米尔人控制地区的人可以使用 [TZ='Asia/Kolkata'],
因为该区域自 1970 年截止日期以来已与泰米尔地区达成一致。
来自 Sadika Sumanapala (2016-10-19):
根据http://www.sltime.org(由测量单位维护,
Standards & Services Department, Sri Lanka) 斯里兰卡的缩写
标准时间是 SLST。
来自保罗·埃格特(2016-10-18):
“SLST”似乎是相当近的,并且很少在外部时间使用
区域书呆子来源。我搜索了谷歌新闻,发现了三种用途
它在二月份的印度国际商业时报和
今年 3 月讨论板球比赛时间时,但没有
从那以后(尽管有很多板球比赛)并且什么都没有
其他英语新闻来源。我们的旧缩写“LKT”是
更糟糕。现在,让我们使用数字缩写;我们可以
如果它赶上,切换到“SLST”。
我假设您的数据库无法识别您计算机当前的本地时区。可能有三种可能的解决方案:
- 将您的计算机区域设置更改为更稳定的设置,例如印度
- 用最新版本的时区文件更新数据库,见Upgrading the Time Zone File and Timestamp with Time Zone Data
- 如果您使用 ODP.NET 非托管驱动程序
Oracle.DataAccess.dll(很遗憾您没有告诉我们),您可以将ORA_SDTZ 环境变量或注册表项HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_<Oracle home name>\ORA_SDTZ / HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ORACLE\KEY_<Oracle home name>\ORA_SDTZ 设置为所需的时区值。请注意,ODP.NET 托管驱动程序不会读取此注册表值。