开发中对秒的认识

国际化开发中,避免不了时间的转换,一步小心就会深陷其中。但是只要抓住了对"秒"的认识,问题就自然而然不是问题,也不会深陷不得要领。

在java语言中 System.currentTimeMillis()返回的毫秒,这个毫秒其实就是自1970年1月1日0时起的毫秒数,以下为jdk的文档注解

public static long currentTimeMillis()
返回以毫秒为单位的当前时间。注意,当返回值的时间单位是毫秒时,值的粒度取决于底层操作系统,并且粒度可能更大。例如,许多操作系统以几十毫秒为单位测量时间。

请参阅 Date 类的描述,了解可能发生在“计算机时间”和协调世界时(UTC)之间的细微差异的讨论。

返回:
当前时间与协调世界时 1970 年 1 月 1 日午夜之间的时间差(以毫秒为单位测量)。
做个假设,如果现在是1970-01-01 00:00:01 ,位置处在英国格林尼治,那你认为现在是几点? 答案是凌晨00:00:01。 好来一个时空瞬间转移,你现在是在北京,那你表显示的时间是多少?正确答案是08:00:01。 当中原因是大家都知道的北京 比伦敦早8(小时)×3600(每小时秒数)=28800秒。 

好了,我们谈谈程序开发中用到的时间,假设刚才的情景同时在北京和伦敦运行

public static void main(String args[]) {

            System.out.println( System.currentTimeMillis());

}

打印的内容是什么?

答案都是1000  , 也就是说从1970-01-01 00:00:00开始计算的秒数都参考伦敦格林尼治时间,秒数是没有时区概念,只要你的机器时间是准确的,不管使用那个时区,System.currentTimeMillis()/1000都能返回正确的秒数。 因此,简单的说在同一个秒中,你会由于处在不同的地方显示的时间不一样,但秒数是一样的。

开发中的应用

在系统设计时,记录产生的时间可以用秒或微妙来记录,显示的时候可以在数据库层做转换或者java代码层做转换

数据库层(Postgres SQL) 参考

select TO_CHAR( to_timestamp( create_time) AT TIME ZONE 'UTC+08'   , 'YYYY-MM-DD HH24:MI:SS') as displayTimestr

java代码层

public static String formataDateTimeToDateStr( String timezone ,long disSecond ) {
long localOffset = TimeZone.getDefault().getRawOffset() ; //你运行程序的时间偏移量
long remoteOffset = TimeZone.getTimeZone(timezone).getRawOffset(); //你远端机器的时间偏移量
long offset =  remoteOffset - localOffset ; //因为使用运行程序的机器作为参考点,所以需要减去
long misecond = disSecond* 1000 + offset ; 
return formateMilsecondToLenStr( misecond );
}

        public static String DATE_FORMAT_LONG="yyyy-MM-dd HH:mm:ss";

public static String formateMilsecondToLenStr(Long milsecond) {
SimpleDateFormat sdf=new SimpleDateFormat( DATE_FORMAT_LONG );
return sdf.format( new Date(milsecond) );
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值