postgresql、c#和windows server 2019的问题

postgresql、c#和windows server 2019的问题,c#,windows,postgresql,C#,Windows,Postgresql,我有一个非常奇怪的问题,我有一个用postgresql连接到本地服务器的应用程序,该应用程序是用visual studio 2019、c#和npgsql驱动程序编程的,该应用程序所做的是从数据库中请求列时间戳的时区。到目前为止还不错,它给了我时区值​​-3和-4是我所期望的。然后我使用相同的框架、版本的postgresql server和驱动程序使用相同的应用程序,但当我在有windows server 2019的服务器上运行此应用程序时,无论我做什么,它总是返回值为8的时区,我的计算机和win

我有一个非常奇怪的问题,我有一个用postgresql连接到本地服务器的应用程序,该应用程序是用visual studio 2019、c#和npgsql驱动程序编程的,该应用程序所做的是从数据库中请求列时间戳的时区。到目前为止还不错,它给了我时区值​​-3和-4是我所期望的。然后我使用相同的框架、版本的postgresql server和驱动程序使用相同的应用程序,但当我在有windows server 2019的服务器上运行此应用程序时,无论我做什么,它总是返回值为8的时区,我的计算机和windows server 2019的时区是相同的,并且都位于同一个国家,两者的操作系统均已更新至最新版本

这是类的主方法的代码

static void Main(string[] args)
    {
        PgSqlConnection pgSqlConnection1 = new PgSqlConnection();
        pgSqlConnection1.Host = "127.0.0.1";
        pgSqlConnection1.Port = 5432;
        pgSqlConnection1.UserId = "postgres";
        pgSqlConnection1.Password = "230169";
        pgSqlConnection1.Database = "biotime";

        pgSqlConnection1.Open();

        PgSqlCommand command = pgSqlConnection1.CreateCommand();
        command.CommandText = "SELECT EXTRACT(TIMEZONE FROM now())/3600.0 as zona;";

        PgSqlDataReader reader = command.ExecuteReader();

        PgSqlDataAdapter adaptador = new PgSqlDataAdapter(command);

        DataTable tabla = new DataTable();

        adaptador.Fill(tabla);


        Console.WriteLine(tabla.Rows[0][0].ToString());


        Console.ReadKey();

    }

我使用的是DEVART connector form postgresql,但NPGSQL也存在同样的问题,我认为这里对PG时间存储有一些基本误解。Postgres中的时间戳不“存储时区”,因此您无法让PG“为您提供存储的时区”

关于数据类型:

timestamp
存储您给定的任何时间,或者如果使用
now()
作为值,则存储db设置为的任何时区中的任何时间。如果你给它一个“15:00”的时间,它存储15:00。如果使用偏移量(如15:00-0500)给它一个时间,它将丢弃该偏移量并存储15:00。如果芝加哥现在是下午3点,您告诉db它住在芝加哥,然后插入
now()
,则存储15:00

当您要求返回时,您得到的时间是存储的时间,即使您更改了数据库的时区

  • 该列是一个时间戳
  • db位于-8中(为了简化操作,位于不观察DST的位置),您可以存储15:00的时间(通过插入值“15:00”或在-8区域中正好是下午3点时使用now()函数)
  • 查询数据库会将时间报告为15:00
  • 将db更改为-5(非DST)区域
  • 查询该表仍然会给出15:00的时间
timestamptz
获取任何带有偏移量的时间戳,并将其转换为UTC。如果您从
now()
获取时间,则该时间是声明区域中的当前时间,转换为UTC等效时间。存储UTC时间。您提供的偏移量(或您使用
now()
函数时的活动时区偏移量)不会被存储。当您要求返回时,db将根据当前配置的区域转换存储的时间,并将其显示为该区域中的时间

  • 该列是一个时间戳
  • db位于-8(非DST)中,您可以存储15:00的时间(通过插入值“15:00”或插入值“15:00-0800”或插入值“16:00-0700”或插入值“17:00-0600”或通过…或在-8区域正好是下午3点时使用now()函数)
  • 查询表时给出的时间为“15:00-0800”(即使您插入了“16:00-0700”,它也会存储为“23:00+0000”,并在查询时转换为“15:00-0800”,因为数据库位于-8中
  • 将db更改为-5(非DST)区域
  • 现在查询表时给出的时间为“18:00-0500”;相同的时间,相同的存储值为“23:00+0000”,表示方式不同
因此,
EXTRACT TIMEZONE FROM somestoredtimestamp
实际上只是“在您设置的时区中,此存储时刻的适用偏移量是多少?”的同义词,它不是从任何东西中提取时区-它给出当前已知时区中该时间与UTC的偏移量。如果db设置为Chicago(观察DST)然后,根据日期是什么时间,你会得到-5或-6。如果数据库设置为不遵守DST的位置,那么不管日期,你都会得到一致的偏移量。偏移量不是时区,所以“提取时区”是一个误称


PG使用的时区可以在多个位置进行设置—PostgreSQL配置文件、TZ环境变量、连接字符串、每个会话都可以通过将时区设置为…,如果没有在其他位置进行设置,它甚至可以使用windows控制面板区域设置


您从EXTRACT TIMEZONE命令中获得+8,因为PG认为它生活在+8的区域,并且没有DST(如新加坡)

好的,我也阅读了关于时间戳的相同文档,没有保存时区,但巧合的是数据返回正确,因为在我的国家,时区每年更改2次(冬季和夏季)上一次变化发生在9月5日,查询在数据中反映了这一变化。