Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.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
针对地理位置不同的用户的数据操作/存储的Java最佳实践_Java_Database_Date_Datetime - Fatal编程技术网

针对地理位置不同的用户的数据操作/存储的Java最佳实践

针对地理位置不同的用户的数据操作/存储的Java最佳实践,java,database,date,datetime,Java,Database,Date,Datetime,我已经阅读了所有其他关于日期操纵的问答,但似乎没有一个能给我的担忧提供令人满意的答案 我有一个项目,用户地理位置不同,它在一些类和数据中使用Date。问题是,我正在寻找一种有效的方法来操纵不同用户在各自时区的日期,大多数答案都建议使用库进行日期操纵,这一点我还不太了解,因为我还没有发现任何传统Java无法执行的操作,因此,如果有人能解释我能用传统java做不到的事情,那么我可以考虑使用它。 我终于找到了使用System.currentTimeMillis()将日期保存到数据库(任何数据库)的方法

我已经阅读了所有其他关于日期操纵的问答,但似乎没有一个能给我的担忧提供令人满意的答案

我有一个项目,用户地理位置不同,它在一些类和数据中使用
Date
。问题是,我正在寻找一种有效的方法来操纵不同用户在各自时区的日期,大多数答案都建议使用库进行日期操纵,这一点我还不太了解,因为我还没有发现任何传统Java无法执行的操作,因此,如果有人能解释我能用传统java做不到的事情,那么我可以考虑使用它。 我终于找到了使用
System.currentTimeMillis()
将日期保存到数据库(任何数据库)的方法。这将避免我担心使用数据库存储日期的时区。如果要查询数据库中的特定日期或日期范围,我将使用要查询的
日期的
long
值执行查询:

SELECT * FROM table1 WHERE date1>=1476653369000
在检索
ResultSet
时,我会使用请求数据的用户的时区将从数据库检索到的
long
值格式化为可读的
Date

Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(resultSet.getLong(1));
cal.setTimeZone(TimeZone.getTimeZone("Asia/Calcutta"));
Date myDate = cal.getTime();
根据我读到的一些观点,有些人强调存储
System.currentTimeMillis()
绝对不是最佳实践,然而,出于某种原因,他们都没有说出为什么这是不可取的。我错过什么了吗?这是否会导致转换的性能问题
Long->Date
/
Date->Long
?在数据库中使用
Long
而不是
Date
时,是否存在无法完成的用例?是否有人可以对此进行解释

另一方面,假设我一直使用
Date
值在数据库中存储日期,有没有办法避免在处理数据库
Date
时担心时区

提前谢谢

我可以用Joda做什么,而传统Java做不到

在一般情况下,这并不是关于传统Java能做什么或不能做什么。它更多的是关于库API如何工作,使您比传统Java编写更好(更健壮、更正确)的代码更容易

如此之多,以至于在Java8中,JodaAPI或多或少地被逐字复制/采用,只是更改了包名并合并到Java8SE标准库中

因此,如果使用java 8,则应该选择新的API,如果不是,则应该考虑使用JoDA至少能为您在升级到/java 8时提供一个平滑的路径。 举几个例子:

  • 日期和时间类型的一致API
  • 日期/时间对象是不可变的,操作将返回表示已更改值的类型的新实例。(像Java字符串)。这使得重新使用日期/时间对象变得更容易
  • 通过设计,避免将DST和时区相关的值/操作与DST和时区无关的值/操作混合使用。这使得编写工作一致且正确的代码变得更加容易,并且不存在依赖于时区/地区/日期/时间的死角情况
  • toString()
    这样的默认设置是合理的,因此序列化/反序列化可以以最小的工作量正常工作
  • 文化/区域设置相关的角落案例和您还不知道的事情(例如,您知道传统的韩国日历吗?),这为您在区域设置/日历系统之间转换日期时间节省了大量麻烦。还有:丰富的格式选项
  • Instant
    s的概念表示“绝对”时间戳,在使用地理分布的系统(当系统默认时钟/时区和DST规则可能不同时)或用于互操作时非常有用,因为它使用UTC
编辑以添加:

根据我读到的一些观点,有些人强调存储
System.currentTimeMillis()
绝对不是最佳实践,然而,出于某种原因,他们都没有说为什么不推荐。我错过什么了吗

System.currentTimeMillis()
有一些缺点。最大的缺点是时钟的类型定义不清。它可以是一个单调的时钟,可以是受DST和时区限制的时钟,也可以是UTC时间。它也不一定是一个精确的时钟,实际上不能保证精确到毫秒。基本上,无论发生什么事情,都会在当前时间的某个表面上起作用

这意味着,如果您想使用多个服务器来处理传入的请求,例如,当您不得不考虑使用“代码> > Surviv.TimeTimeMILLISH()/代码>从服务器<代码> <代码> >在您的程序在不同的服务器上运行的上下文中>代码> B<代码>第二天,例如:

我已经阅读了所有其他关于日期操纵的问答

不,你肯定没有全部读过

  • 您可能已经了解到,传统的日期时间类(例如
    java.util.date
    &
    java.util.Calendar
    )和Joda时间项目都被java.time类(1890个“java.time”搜索结果)所取代
  • 您将学会不跟踪日期时间值作为历元的计数。调试和记录变得非常困难,因为无法发现bug,因为人类无法破译长整数作为日期时间的含义。而且因为在各种软件中使用了许多计数粒度(整秒、毫秒、微秒、纳秒、整天等等)和至少一种粒度
    Instant instant = Instant.now();
    
    myPreparedStatement.setObject( … , instant );
    
    myPreparedStatement.setTimestamp( … , java.sql.Timestamp.from( instant ) );
    
    ZoneId z = ZoneId.of( "Asia/Kolkata" );
    ZonedDateTime zdt = instant.atZone( z );
    
    Instant instant = zdt.toInstant();
    
    LocalDate ld = LocalDate.of( 2016, 1 , 1 );
    // Determine the first moment of 2016-01-01 as it happens in Kolkata.
    ZonedDateTime zdt = ld.atStartOfDay( ZoneId.of( "Asia/Kolkata" ) ); 
    Instant instant = zdt.toInstant();  // Adjust to UTC and store.