Java时间处理相对时间 之 时区相关

Java时间处理相对时间 之 时区相关;

在一些场景下需要取得一个相对时间值,比如取1994年1月1号到当前时间的值,这个值是一个相对值,即:不管在哪个时区,如果是同一个时间获取的值是一样的;

在Java的代码处理上需要注意一下,这里提供一个方法:

1. 思路就是将需要换算的时间转换为同一个时区来进行计算:

/**

* 获取当前时间,相对1994的秒数

* @return int

*/

public static int getSecondFrom1994()

{

int seconds = 0;

try

{

Calendar curDate = Calendar.getInstance();

curDate.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));

SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",Locale.CHINA);

fmt.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));

Date date_1994 = fmt.parse("1994-01-01 00:00:00");

seconds = (int) ((curDate.getTimeInMillis() - date_1994.getTime()) / 1000);

uniportal_logger.trace("----getSecond1994----:"+seconds);

}

catch(Exception ex)

{

ex.printStackTrace();

}

return seconds;

}

/**

* 根据日期字符串获取相对1994-01-01的秒数

* @param dateStr String

* @return long

*/

public static int getMilSecondFrom1994(String dateStr)

{

int seconds = 0;

if(dateStr == null || dateStr.length() == 0)

{

return seconds;

}

try

{

SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",Locale.CHINA);

fmt.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));

Date date_1994 = fmt.parse("1994-01-01 00:00:00");

Date date_temp = fmt.parse(dateStr);

seconds = (int) ((date_temp.getTime() - date_1994.getTime()) / 1000);

uniportal_logger.trace("----getMilSecondFrom1994----:"+seconds);

}

catch(Exception ex)

{

ex.printStackTrace();

}

return seconds;

}

/**

*根据相对1994年的秒数,获取应该显示的时间字符串

* @return string

*/

public static String getDate1994(int seconds)

{

int DaysPerYear = 365;

int[] DaysPerMonth = {31,28,31,30,31,30,31,31,30,31,30,31};

int days = seconds / 86400;

int second = seconds % 86400;

int hour = second / 3600;

second = second % 3600;

int minute = second / 60;

second = second % 60;

int dayss = days;

/* compute year */

int year = 1994;

while(days >= DaysPerYear)

{

days -= DaysPerYear;

if((++year % 4) == 0)

DaysPerYear = 366;

else

DaysPerYear = 365;

}

/* compute month */

if((year % 4) == 0)

DaysPerMonth[1] = 29;

else

DaysPerMonth[1] = 28;

int month = 1;

while(days >= DaysPerMonth[month - 1])

{

days -= DaysPerMonth[month - 1];

month++;

}

/* compute date and week */

int day = days + 1;

int week = (dayss + 6) % 7;

if(week == 0)

week = 7;

StringBuffer buf = new StringBuffer();

buf.append(year).append("-");

buf.append(month > 9 ? month : ("0" + month)).append("-");

buf.append(day > 9 ? day : ("0" + day)).append(" ");

buf.append(hour > 9 ? hour : ("0" + hour)).append(":");

buf.append(minute > 9 ? minute : ("0" + minute)).append(":");

buf.append(second > 9 ? second : ("0" + second));

String str = buf.toString().trim();

if("1994-01-01 00:00:00".equals(str))

{

str = "";

}

return str;

}

2. 相关linux命令:

修改时区为美国的: TZ=‘America/Caracas‘; export TZ     有半个小时的差别

修改为中国东八时区的: TZ=‘Asia/Shanghai‘; export TZ   整个时区

时间: 2024-11-07 11:09:51

Java时间处理相对时间 之 时区相关的相关文章

Java 获取各时区时间,获取当前时间到格林威治时间1970年01月01日00时00分00秒的秒数

格林威治时间即UTC/GMT时间,1970年01月01日00时00分00秒(即UTC+8的北京时间1970年01月01日08时00分00秒)计算代码如下: 1 /** 2 * 获取指定时间到格林威治时间的秒数 3 * UTC:格林威治时间1970年01月01日00时00分00秒(UTC+8北京时间1970年01月01日08时00分00秒) 4 * @param time 5 * @return 6 */ 7 public static long diffSeconds(String time){

【时区】java项目new date()时间和服务器时间(数据库)不一致

造成这种问题的原因可能是:你的操作系统时区跟你JVM的时区不一致. 你的操作系统应该是中国的时区吧,而JVM的时区不一定是中国时区,你在应用服务器的Java虚拟机添加如下配置:  -Dfile.encoding=UTF8     -Duser.timezone=GMT+08 在一个精简的Linux安装上jre,发现所有的java程序获取的时间都不是系统时间.后来发现原来是时区不对.java程序获取的时间都是GMT时间,而系统是北京时间,应该是GMT+8,刚好相差8小时.网上搜了好多资料,只有两种

[原创]Java项目统一UTC时间方案

Java项目统一UTC时间方案 作者:Gods_巨蚁 引言 近期团队的个别项目在进行框架升级后,部分时间值存在8小时误差,原因是错误的将数据库中的时间数据理解成了UTC时间(旧版本认为是北京时间) 考虑到未来项目对于时间理解的一致性,我决定将项目统一为使用UTC时间,经调研,形成本文 mysql数据库时区及时间时间类型说明 数据库时区 mysql数据库拥有时区设置,默认使用系统时区 可通过如下语句查询当前时区 show variables like '%time_zone%'; 下图为我个人机器

Java 8新的时间日期库的20个使用示例

除了lambda表达式,stream以及几个小的改进之外,Java 8还引入了一套全新的时间日期API,在本篇教程中我们将通过几个简单的任务示例来学习如何使用Java 8的这套API.Java对日期,日历及时间的处理一直以来都饱受诟病,尤其是它决定将java.util.Date定义为可修改的以及将SimpleDateFormat实现成非线程安全的. 看来Java已经意识到需要为时间及日期功能提供更好的支持了,这对已经习惯使用Joda时间日期库的社区而言也是件好事.关于这个新的时间日期库的最大的优

Java 8 – 日期和时间实用技巧

当你开始使用Java操作日期和时间的时候,会有一些棘手.你也许会通过System.currentTimeMillis() 来返回1970年1月1日到今天的毫秒数.或者使用Date类来操作日期:当遇到加减月份.天数的时候 你又需要用到Calendar类:当需要格式化日期的时候需要使用java.text.DateFormat类. 总而言之在Java中操作日期不是很方便,以至于很多开发者不得不使用第三方库,比如: joda-time. 现有API存在的问题 线程安全: Date和Calendar不是线

Java格式化CST日期时间

Date date = new Date(); System.out.println(date); 我们将在控制台打印出 Thu Aug 27 18:05:49 CST 2015 格式字符串 下列代码可以实现将Java的CST格式的时间字符串转为为Date对象和所需要的日期时间格式! String date = "Thu Aug 27 18:05:49 CST 2015"; SimpleDateFormat sdf = new SimpleDateFormat("EEE MM

Java 获取当前日期和时间

原文地址:http://www.blogjava.net/parable-myth/archive/2013/01/17/394364.html 有三种方法: 方法一:用java.util.Date类来实现,并结合java.text.DateFormat类来实现时间的格式化,看下面代码: import java.util.*; import java.text.*;//以下默认时间日期显示方式都是汉语语言方式//一般语言就默认汉语就可以了,时间日期的格式默认为MEDIUM风格,比如:2008-6

java new Date()得到的时间和系统时间不一样

造成这种问题的原因是:操作系统时区跟JVM的时区不一致. [[email protected] ~]# timedatectl Local time: Thu 2016-12-29 15:35:44 CST Universal time: Thu 2016-12-29 07:35:44 UTC RTC time: Thu 2016-12-29 07:35:45 <strong>Time zone: Asia/Shanghai (CST, +0800)</strong> NTP en

Docker运行java应用,应用日志时间和容器时间不一致

docker运行activemq,日志时间和容器时间如下: d我执行date命令隔了几分钟,由时间上发现正好差了8个小时,怀疑还是时区的原因. 2.疑惑 有好友称,讲宿主机的/etc/locatime挂载到容器中,就会解决此问题.可是得到的结果是依然是上图. 3.查询资料,请教大神,得到结果 在java应用启动前,添加参数 -Duser.timezone=GMT+08 4.我的java应用是Activemq消息队列,编辑activemq的启动脚本 vi   /opt/activemq/bin/a