java夏令时问题解决,java夏令时问题解决

发布时间:2022-11-22

本文目录一览:

  1. java中utc时间怎么转换为本地时间
  2. 如何在linux下 使用java代码正确获取夏令时的时间
  3. java中获取的系统时间和电脑上显示的差两分钟,是什么原因
  4. 时区的坑,不想再踩了

java中utc时间怎么转换为本地时间

百度本来就有的回答。。。。 若要将 UTC 转换为本地时间,请按照下列步骤操作:

  1. 确定您的本地时间偏移量,从 UTC 时间。为此请 Microsoft 基于 Windows 的计算机上按照下列步骤操作:
    • 单击 开始,单击 运行,键入 timedate.cpl,然后单击 确定。
    • 单击 时区 选项卡,然后验证选中了您的本地时区。如果不选择您的本地时区,则请在可用的时区的列表中单击它。
    • 在每个本地区域列表项开始时显示本地时间偏移量。例如对于-5:00 是本地时间偏移量为东部时间 (美国和加拿大):
      (GMT-5:00) 东部时间 (美国和加拿大)
      
  2. 添加本地时间偏移量为 UTC 时间。
    • 例如您的本地时间偏移量是-5:00,然后如果 UTC 时间显示为 11:00,添加-5 到 11。偏移量的调整时该时间设置为 06:00 (上午 6:00)。
    • 注意:该日期也采用 UTC 格式。例如您的本地时间偏移量是-8:00,并且如果该文件的 UTC 时间显示为 00:00 (午夜 12:00)在星期一,调整后的时间是 16:00 星期日 (下午 4:00,星期日)。
  3. 调整为夏时制时间。
    • UTC 时间不以反映夏令时进行调整。如果您所在的时区参与夏时制时间,添加当夏时制时间是有效的文件的偏移量调整时间的时间差别。例如如果在您的时区中的夏令时的标准时间提前一小时,将 1 小时的时间添加到偏移量调整时间。
  4. 如果您的本地时间使用 12 小时格式,请将 24 小时时间格式转换为 12 小时时间格式。要在转换请按照下列步骤操作:
    • 如果偏移量调整的时间在 12:01 和 23:59(含)之间,减去 12 从在调整后的时间,然后将附加 下午
    • 如果已调整的时间介于 00:01 和 11:59(含)之间,留在调整后的时间为是,然后将附加 上午
    • 如果已调整的时间为 00:00,则使用 午夜 12:00
    • 如果已调整的时间为 12:00,使用 中午 12:00。 此内容转的,出处:

如何在linux下 使用java代码正确获取夏令时的时间

一:环境搭建

  • OpenOffice 下载地址
  • 下载地址
  • 解压后将目录下的所有jar包放在工程的lib下面或者采用引用的方式调用这些jar包。
  • 下载后安装,我安装的路径为 D:/openOffice/install/

二:启动服务

可以通过cmd调用服务:

cd D:/openOffice/install/program

执行:

soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard

查看是否安装成功:

netstat -ano|findstr 8100

查看pid对应的服务程序名:

tasklist|findstr pid值

也可以把这一步省略,放到Java程序中调用服务,因为启动服务占用内存比较大,在Java中可以在使用的时候调用,然后马上销毁。

三:程序代码

1. 将word转换为pdf方法

// 将word格式的文件转换为pdf格式
public void Word2Pdf(String srcPath, String desPath) throws IOException {
    // 源文件目录
    File inputFile = new File(srcPath);
    if (!inputFile.exists()) {
        System.out.println("源文件不存在!");
        return;
    }
    // 输出文件目录
    File outputFile = new File(desPath);
    if (!outputFile.getParentFile().exists()) {
        outputFile.getParentFile().exists();
    }
    // 调用openoffice服务线程
    String command = "D:/openOffice/install/program/soffice.exe -headless -accept=\"socket,host=127.0.0.1,port=8100;urp;\"";
    Process p = Runtime.getRuntime().exec(command);
    // 连接openoffice服务
    OpenOfficeConnection connection = new SocketOpenOfficeConnection("127.0.0.1", 8100);
    connection.connect();
    // 转换word到pdf
    DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
    converter.convert(inputFile, outputFile);
    // 关闭连接
    connection.disconnect();
    // 关闭进程
    p.destroy();
    System.out.println("转换完成!");
}

2. 调用方法

@Test
public void testWord2Pdf() throws IOException {
    String srcPath = "E:/test.docx";
    String desPath = "E:/test.pdf";
    Word2Pdf(srcPath, desPath);
}

以上代码经过验证,可以正常运行。

四:遇到问题

错误信息:

java.net.ConnectException: connection failed: socket,host=10.101.50.71,port=8100,tcpNoDelay=1: java.net.ConnectException: Connection refused: connect
at com.artofsolving.jodconverter.openoffice.connection.AbstractOpenOfficeConnection.connect(AbstractOpenOfficeConnection.java:79)

原因以及解决方法: 第一次调用,soffice需要注册,所以到soffice.exe的安装路径下双击soffice.exe,注册即可。

java中获取的系统时间和电脑上显示的差两分钟,是什么原因

你确认一下,服务器是否在当前的机器上,如果是,一般不会出现误差;又或许,你在或许当前时间后,业务逻辑处理需要进行两分钟,因此出现两分钟的误差。你自己排查一下。

时区的坑,不想再踩了

最近在使用date命令时,发现表示东8区(中国时区)要使用 GMT-8,但在Java中却需要使用 GMT+8,如下: 而在Java中,如下: 这就让人有点迷糊了,经过一段时间搜索,发现在时区表达形式上还有不少知识点呢! 众所周知,为了方便各地区本地时间之间的转换,人们将全球划分为了24个时区,以格林尼治天文台(GMT)为零时区,往东西两个方向分别有12个时区,所以自然有了以GMT为前缀的时区表示法,如下:

  • GMT+8 表示东8区,中国就是使用这个时区,而 GMT-8 表示西8区,如果格林尼治天文台的本地时间是2022-03-19的0点,那么 GMT+8 地区的本地时间就是2022-03-19的8点,而 GMT-8 的本地时间就是往前8小时,即2022-03-18的16点。 注意,上面的各地区本地时间的表述虽然不同,但它们实际是同一个时刻(绝对时间),要理解本地时间与绝对时间的区别。 GMT+8 正是Java中支持的时区表示法,那为啥Linux中却是 GMT-8 呢?实际上Linux中的 GMT-8 也可以写成 Etc/GMT-8,这才是它的标准名称,如下: 可以发现用 Etc/GMT-8 的话,Linux与Java的输出都是一样的了,是的,Etc/GMT-8 也是一种类似 GMT+8 的时区表示机制,只不过它的 +- 号是反的。 虽然上面的差异弄清楚了,但时区的表示形式还没有介绍完,接着往下看... 除了 GMT+8 表示方式外,我们还经常会看到 UTC+8 这样的表示方式,这是UTC时区表示法。 即生GMT何生UTC?这是由于GMT是以格林尼治天文台为时间基准,但地球不是完美球体且自转速度在变慢,所以地球自转速度并不均匀,这导致以格林尼治天文台为时间基准是不准的。 为了更准确度量时间,科学家们发明了UTC时间,以铯原子跃迁次数来度量时间,比GMT时间更准确,为了保证GMT的准确性,每隔几年GMT时间会做一次调整,以与UTC时间对齐。 因此,既然有了更准确的UTC,那么就有了以UTC为前缀的时区表示法,如中国时区可使用 UTC+8。 各时区偏移量表示法一览表,如下: 除了用偏移量来表示时区,为了方便,人们还按区域/城市的方式来定义时区,如 Asia/ShanghaiAsia/Hong_Kong 都表示东8区,具体有哪些城市命名的时区,可以在时区数据库中查看。 另外,为了简化区域时区表示法,又定义了一套时区缩写,如CST是中国时区 China Standard Time 的缩写,可以在时区缩写中查看各种缩写定义。 注意,一般都不建议使用时区缩写,因为时区缩写的命名经常会重复,比如CST是 Central Standard Time(北美中部标准时间UTC -6)、China Standard Time(中国标准时间UTC +8)、Cuba Standard Time(古巴标准时间UTC -5)。 由于不同软件对CST的解释可能不同,导致会出现时间相差13或14个小时的情况,这在Java搭配MySQL时经常出现,我还专门写了一篇文章 mysql的timestamp会存在时区问题?,对于一定要使用时区缩写的场景,可以使用香港时区缩写 HKT,它不重复且和上海处于同一个时区。 在Java中和时区相关的类有 TimeZoneZoneId,其中 TimeZone 是老的时区类,而 ZoneId 是新的时区类,它有 ZoneOffsetZoneRegion 两个子类,分别代表偏移量表示法和区域表示法。 那它们都支持上述的哪些时区写法呢?写个Demo验证一下,如下: 输出如下: 虽然偏移量表示法与区域表示法都可以表示时区,但由于夏令时的存在,它们并不完全等同。 夏令时(Daylight Saving Time: DST),也叫 夏时制,是指为了节约能源,在天亮的早的夏季,人为将时间调快一小时,以充分利用光照资源,节约照明用电。 而中国在 1986 年至 1991 年也实行过夏令时,在1986~1991的每年从四月中旬第一个星期日的凌晨2时整(北京时间),将时钟拨快一小时,即将表针由2时拨至3时,夏令时开始;到九月中旬第一个星期日的凌晨2时整(北京夏令时),再将时钟拨回一小时,即将表针由2时拨至1时,夏令时结束。从1986年到1991年的六个年度,除1986年因是实行夏时制的第一年,从5月4日开始到9月14日结束外,其它年份均按规定的时段施行。 故会有下面看起来有点奇怪的现象: 为什么 Asia/Shanghai 输出为3点,而 GMT+8 输出为2点呢?原因是 1986-05-04 02:00:00 这个时间点中国正开始实行夏令时,时钟拨快了1小时。 而 GMT+8 为什么输出为2点呢?因为中国、马来西亚、菲律宾、新加坡的时区都是 GMT+8,只有中国在实行夏令时,而在 GMT+8 中没法感知到区域信息,那Java只能以没有实行夏令时的方法来计算本地时间了。 正是由于夏令时的存在,导致程序可能出现诡异的现象甚至bug,如下: 输出如下: 为啥会这样呢?原因是本地时间虽然看起来没变,但 Asia/Shanghai 这个代表的时区却发生了变化。 我们可以将上面 printZonedDateTime 中时间格式由 yyyy-MM-dd HH:mm:ss VV 修改为 yyyy-MM-dd HH:mm:ss VV xxx 再执行,发现输出如下: 如上,夏令时导致 Asia/Shanghai 这个时区不一定是东8区了,也可能是东9区,故Java中,想将 ZoneRegion 转换为 ZoneOffset,需要传递一个 instant 时刻参数,如下: 夏令时真是一种自欺欺人的做法,还好中国从1991年后就没再实行了!