国际化开发中,避免不了时间的转换,一步小心就会深陷其中。但是只要抓住了对"秒"的认识,问题就自然而然不是问题,也不会深陷不得要领。
在java语言中 System.currentTimeMillis()返回的毫秒,这个毫秒其实就是自1970年1月1日0时起的毫秒数,以下为jdk的文档注解
public static long currentTimeMillis()
-
返回以毫秒为单位的当前时间。注意,当返回值的时间单位是毫秒时,值的粒度取决于底层操作系统,并且粒度可能更大。例如,许多操作系统以几十毫秒为单位测量时间。
请参阅
Date
类的描述,了解可能发生在“计算机时间”和协调世界时(UTC)之间的细微差异的讨论。 -
-
返回:
- 当前时间与协调世界时 1970 年 1 月 1 日午夜之间的时间差(以毫秒为单位测量)。
好了,我们谈谈程序开发中用到的时间,假设刚才的情景同时在北京和伦敦运行
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) );
}