本文中,我们将展示如何在不同时区之间转换时间,我们分别使用Date、Calendar、Joda Time。

本例从新加坡时区

(GMT+8:00) Asia/Singapore - Singapore Time

Date : 22-1-2015 10:15:55 AM

转换到美国纽约时区

(GMT-5:00) America/NewYork - Eastern Standard Time

Date : 21-1-2015 09:15:55 PM

注意,在JDK1.7版本之前,java.util.Date没有时区的概念,Date对象只显示系统的时间和系统的默认时区。

1.使用Date

使用DateFormat格式化时间(需要设置时区)

SimpleDateFormat sdfAmerica = new SimpleDateFormat("dd-M-yyyy hh:mm:ss a");

sdfAmerica.setTimeZone(TimeZone.getTimeZone("America/NewYork"));

String sDateInAmerica = sdfAmerica.format(date);

完整的代码如下:

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.TimeZone;

public class TimeZoneTest {

public static void main(String[] argv) throws

ParseException {

SimpleDateFormat formatter = new SimpleDateFormat("dd-M-yyyy hh:mm:ss a");

String dateInString = "22-01-2015 10:15:55 AM";

Date date = formatter.parse(dateInString);

TimeZone tz = TimeZone.getDefault();

// From TimeZone Asia/Singapore

System.out.println("TimeZone : " + tz.getID() + " - " + tz.getDisplayName());

System.out.println("TimeZone : " + tz);

System.out.println("Date : " + formatter.format(date));

// To TimeZone America/NewYork

SimpleDateFormat sdfAmerica = new SimpleDateFormat("dd-M-yyyy hh:mm:ss a");

TimeZone tzInAmerica = TimeZone.getTimeZone("America/NewYork");

sdfAmerica.setTimeZone(tzInAmerica);

String sDateInAmerica = sdfAmerica.format(date); // Convert to String first

Date dateInAmerica = formatter.parse(sDateInAmerica);

System.out.println("\nTimeZone : " + tzInAmerica.getID() +

" - " + tzInAmerica.getDisplayName());

System.out.println("TimeZone : " + tzInAmerica);

System.out.println("Date (String) : " + sDateInAmerica);

System.out.println("Date (Object) : " + formatter.format(dateInAmerica));

}

}

输出结果为:

TimeZone : Asia/Singapore - Singapore Time

TimeZone : sun.util.calendar.ZoneInfo[id="Asia/Singapore",offset=28800000,dstSavings=0,useDaylight=false,transitions=9,lastRule=null]

Date : 22-1-2015 10:15:55 AM

TimeZone : America/NewYork - Eastern Standard Time

TimeZone : sun.util.calendar.ZoneInfo[id="America/NewYork",offset=-18000000,dstSavings=3600000,useDaylight=true,transitions=235,lastRule=java.util.SimpleTimeZone[id=America/NewYork,offset=-18000000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=2,startDay=8,startDayOfWeek=1,startTime=7200000,startTimeMode=0,endMode=3,endMonth=10,endDay=1,endDayOfWeek=1,endTime=7200000,endTimeMode=0]]

Date (String) : 21-1-2015 09:15:55 PM

Date (Object) : 21-1-2015 09:15:55 PM

2.使用Calendar

Calendar设置时区

Calendar calendar = new GregorianCalendar();

calendar.setTime(date);

calendar.setTimeZone(tzInAmerica);

我们经常犯的错误是这样获取java.util.Date.

Date dateInAmerican = calendar.getTime();

在以上得例子,不管Calendar的时区如何设置,Date总是显示的时本地的系统时间22-1-2015 10:15:55 AM.

正确得方式是需要使用DateFormat来格式化。

SimpleDateFormat sdfAmerica = new SimpleDateFormat("dd-M-yyyy hh:mm:ss a");

TimeZone tzInAmerica = TimeZone.getTimeZone("America/NewYork");

sdfAmerica.format(calendar.getTime())

或者是使用一种calendar.get()的方法获取。

int year = calendar.get(Calendar.YEAR);

int month = calendar.get(Calendar.MONTH); // Jan = 0, dec = 11

int dayOfMonth = calendar.get(Calendar.DAYOFMONTH);

int hour = calendar.get(Calendar.HOUR); // 12 hour clock

int hourOfDay = calendar.get(Calendar.HOUROFDAY); // 24 hour clock

int minute = calendar.get(Calendar.MINUTE);

int second = calendar.get(Calendar.SECOND);

int ampm = calendar.get(Calendar.AMPM); //0 = AM , 1 = PM

3.使用Joda Time

JodaTime设置时区

DateTime dt = new DateTime(date);

DateTimeZone dtZone = DateTimeZone.forID("America/NewYork");

DateTime dtus = dt.withZone(dtZone);

也是容易饭的错误是,直接转换为java.util.Date,时区的信息将丢失。

//Output : 22-1-2015 10:15:55 AM

Date dateInAmerica = dtus.toDate();

正确得方式是转换为Joda得LocalDateTime

//Output : 21-1-2015 09:15:55 PM

Date dateInAmerica = dtus.toLocalDateTime().toDate();

参考:

Date and Time Manipulation in Java Using JodaTime

SimpledateFormat JavaDoc

World Time Server

java不同时区时间转换,Java在不同时区转换时间相关推荐

  1. java不同时区时间转换,Java不同时区(timezone)之间时间转换

    最近出现一个问题是这样的 我们的系统在国外打印的日志时间由于时差关系和国内不一致 看起来不方便 希望国外的日志和国内保持一致 即 需要对不同时区的时间做转换调整 统一为国内时间. 一.关于时区的一些概 ...

  2. java 不同时区时间转换_Java对世界不同时区timezone之间时间转换的处理方法

    最近出现一个问题是这样的:我们的系统在国外打印的日志时间由于时差关系和国内不一致,看起来不方便,希望国外的日志和国内保持一致,即:需要对不同时区的时间做转换调整,统一为国内时间. 一.关于时区的一些概 ...

  3. Java怎样把时间转成毫秒_如何转换时间格式 java如何把时间格式转为毫秒

    在java中如何把字符串转换成时间格式? /*** 将时间字符串转化为日期格式字符串* @param timeStr 例如:20070911121547 * @return String 例如:200 ...

  4. Linux shell不同时区时间转换(时区 夏令时 时间戳)

    如果目标地区没有使用夏令时,可以日期或时间戳直接减去小时差,也可以使用下面兼容夏令时的方法. 概念:         时间戳 :从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数. ...

  5. js时区时间转换格式:h5内转换含有T字母的8小时时区时间格式

    1.后台传过来的数据含有时区日期,该日期为浏览器识别日期,此时进行日期格式的转换,如采用getFullYears()等方法后,手机微信打开的h5界面则显示为NAN,非法日期格式,此时应采用如下方法转换 ...

  6. 【Java】日期字符串转换java.sql.Date对象

    日期字符串 → java.sql.Date对象 import java.text.ParseException; import java.text.SimpleDateFormat;public cl ...

  7. android 0时区时间格式,Android DateUtils.formatDateTime时区错误

    我得到了DateUtils的解决方案,而没有使用诸如Calendar甚至SimpleDateFormat这样的繁重对象. // Your UTC time in milliseconds: long ...

  8. linux编写多时区时间显示程序,Linux系统时区时间修改

    我们知道,计算机系统有两个时钟,一个是硬件时钟,一个是系统时钟,硬件时钟的工作原理就是电脑在开机运行的时候会给主板上的纽扣电池充电,关机后这块电池还为存放系统参数的CMOS.RAM供电,以保存其中的系 ...

  9. Java小记 —— 日期时间转换问题(相差一小时)

    日期操作的时候经常会在字符串.毫秒和日期对象间转换,而且很多人都使用joda time库进行操作,这就会遇到以下说的问题(相信很多人也遇到了):就是对于某些特殊的日期,转换的时候会报错,或者出现转换不 ...

最新文章

  1. MariaDB 基金会 CEO 宣布将于 10 月 1 日卸任
  2. APMServ下Xdebug安装与使用
  3. RandomAccessFile学习笔记
  4. Android技术经理+资深工程师+研发工程师-杭州
  5. 如何做到 byte[] 和 十六进制 互转?
  6. 第7章:图像的平滑处理
  7. sum() over()函数使用
  8. 针对《关于郝培强的《为什么我们招聘的时候绝不要传智播客的学生?》》的看法
  9. 基于Netty的RPC框架
  10. 服务器ibmc无法加载js文件,引入网络js
  11. spring mvc 前台属性数据的传递和后台属性数据的接收
  12. Pipeline aborted due to error
  13. 如何解决高分辨率下文本、图像和字体和布局?
  14. 海康威视摄像头rtsp推流至H5总结
  15. ajax获取qq音乐源码,jsonp的运用(获取qq音乐首页数据)以及用Promise的封装
  16. 微信小程序的background-image使用
  17. BootstrapBlazor实战 Menu 导航菜单使用(2)
  18. mysql 历史数据迁移,MySQL 历史数据表迁移方法
  19. 令牌桶算法的python实现,人人都可以玩算法
  20. 服务器突然关机的操作系统日志,windows服务器关机日志

热门文章

  1. ethz-asl Hand-Eye-Calibration 实验之hand_eye_calibration_batch_estimation模块
  2. 我的世界java甘蔗机_萌新如何建造我的世界自动化甘蔗收割机攻略
  3. 美甲实体行业没有客户?想做线上引流?这些渠道千万别错过!
  4. JavaScript - H5 网页拨打电话功能、发送短信、发送邮件(支持 HTML 与 JS 形式)点击自动调起手机拨打并填充手机号
  5. XML:Schema、三种编写Schema的方式
  6. eclipse J2EE软件下载
  7. 框架—— Serverlet
  8. 3.4.1python-panda数据筛选
  9. 免费下载英文文献的网站
  10. 《数据结构与算法》实验:排序算法实验比较——选择排序 堆排序