Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 弹簧&x2B;冬眠+;MS SQL server-UTC时区_Sql Server_Spring_Hibernate_Datetime_Timezone - Fatal编程技术网

Sql server 弹簧&x2B;冬眠+;MS SQL server-UTC时区

Sql server 弹簧&x2B;冬眠+;MS SQL server-UTC时区,sql-server,spring,hibernate,datetime,timezone,Sql Server,Spring,Hibernate,Datetime,Timezone,我用Spring 4.2.5+Hibernate 5.1.0开发了一个简单的应用程序-数据库系统是MS SQL Server 2014 几天来,我一直在努力在数据库中正确存储时间+时区 我需要满足的要求是: 保存UTC时区中的所有日期 在数据库列值中存储时区 为了实现它,我创建了一个名为MyComment的模型: @Entity @Table(name = "MY_COMMENT") @EntityListeners(value = { MyCommentListener.class }) @A

我用Spring 4.2.5+Hibernate 5.1.0开发了一个简单的应用程序-数据库系统是MS SQL Server 2014

几天来,我一直在努力在数据库中正确存储时间+时区

我需要满足的要求是:

  • 保存UTC时区中的所有日期
  • 在数据库列值中存储时区
  • 为了实现它,我创建了一个名为MyComment的模型:

    @Entity
    @Table(name = "MY_COMMENT")
    @EntityListeners(value = { MyCommentListener.class })
    @Audited
    public class MyComment implements Serializable {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "ID")
        private Long id;
    
        @Column(name = "DATE_", nullable = false)
        private Timestamp date;
    
        ...
    }
    
    为了在UTC时区强制保存日期,我使用了Jadira框架:

        hibProperties.put("jadira.usertype.autoRegisterUserTypes", true);
        hibProperties.put("jadira.usertype.javaZone", "UTC");
        hibProperties.put("jadira.usertype.databaseZone", "UTC");
    
    但是,在每次创建/更新MyComment对象时,MyCommmentListener都会从我的本地时区(而不是UTC日期!)获取日期:

    }

    你知道我如何解决这个问题吗

  • 我应该在模型中使用其他日期类型吗?和时间戳不同
  • MS SQL server数据库中的日期列应为哪种类型

  • 我将感谢任何帮助。谢谢。

    好吧,问题出在听众身上。替换侦听器中的以下代码并进行验证。根据需要更改日期格式

        @PreUpdate
        @PrePersist
        public void setLastUpdate(MyComment myComment) {
            SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
            dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
            myComment.setDate(dateFormat.getCalendar().getTime());
        }
    

    对我来说很奇怪的是,在春季没有设置默认时区的属性——至少我不知道

    通过谷歌搜索,我发现春季设置时区的最佳地点是
    WebApplicationInitializer
    ,因此我准备了以下代码:

    public class MyWebApplicationInitializer implements WebApplicationInitializer {
    
        @Override
        public void onStartup(final ServletContext servletContext) throws ServletException {
            setupTimeZone();
        }
    
        private void setupTimeZone() {
            TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
        }
    }
    

    是的,你说得对。这段代码可以工作,但我正在寻找一个通用的解决方案,在我的Spring应用程序中默认使用UTC时区。假设我有10个监听器正在为我的模型注入时间,那么我需要将上述代码重复10次。我希望由于我使用的是Jadira,它将使用UTC时区作为默认时区。如果您希望将整个应用程序置于UTC,请在启动时区时使用它。setDefault(TimeZone.getTimeZone(“UTC”);也许你应该加上一个“jadira”标签。您还应该指定是否要在数据库列中存储时区名称或偏移量。请您详细描述一下?我不完全明白你的意思。jadira标签是因为你在使用它们的类型。您的要求似乎是技术性的(存储UTC),但“将时区存储在数据库列值中。”未指定时区偏移量或标识符。标识符包含更多信息,请参阅,这取决于您需要执行的操作。存储时区的目的是什么?
    public class MyWebApplicationInitializer implements WebApplicationInitializer {
    
        @Override
        public void onStartup(final ServletContext servletContext) throws ServletException {
            setupTimeZone();
        }
    
        private void setupTimeZone() {
            TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
        }
    }