转换指定时区的日期/时间
我想将此GMT时间戳转换为GMT + 13:
2011-10-06 03:35:05
我尝试过大约100种不同的DateFormat,TimeZone,Date,GregorianCalendar等组合来尝试做这个非常基本的任务。
此代码完成我想要的CURRENT TIME:
Calendar calendar = new GregorianCalendar(TimeZone.getTimeZone("GMT"));
DateFormat formatter = new SimpleDateFormat("dd MMM yyyy HH:mm:ss z");
formatter.setTimeZone(TimeZone.getTimeZone("GMT+13"));
String newZealandTime = formatter.format(calendar.getTime());
但我想要的是设定时间,而不是使用当前时间。
我发现任何时候我都会尝试设置这样的时间:
calendar.setTime(new Date(1317816735000L));
本地计算机的TimeZone被使用。 这是为什么? 我知道当“新Date()”返回UTC + 0时,为什么当你设置时间以毫秒为单位时,它不再认为时间是UTC?
有可能:
预先感谢您的帮助:D
了解计算机时间的工作原理非常重要。 有了这个说法,我同意如果创建一个API来帮助您像实时一样处理计算机时间,那么它应该以允许您像实时一样对待它的方式工作。 在大多数情况下,情况确实如此,但仍有一些需要关注的重大疏漏。
无论如何,我离题! 如果您有UTC偏移量(最好以UTC格式工作而不是GMT偏移量),则可以计算以毫秒为单位的时间并将其添加到您的时间戳中。 请注意,SQL时间戳可能与Java时间戳有所不同,因为计算历元时间的方式并不总是相同 - 这取决于数据库技术和操作系统。
我建议你使用System.currentTimeMillis()作为时间戳,因为这些可以在java中更加一致地处理,而不用担心将SQL时间戳转换为java日期对象等。
为了计算你的抵消,你可以尝试这样的事情:
Long gmtTime =1317951113613L; // 2.32pm NZDT
Long timezoneAlteredTime = 0L;
if (offset != 0L) {
int multiplier = (offset*60)*(60*1000);
timezoneAlteredTime = gmtTime + multiplier;
} else {
timezoneAlteredTime = gmtTime;
}
Calendar calendar = new GregorianCalendar();
calendar.setTimeInMillis(timezoneAlteredTime);
DateFormat formatter = new SimpleDateFormat("dd MMM yyyy HH:mm:ss z");
formatter.setCalendar(calendar);
formatter.setTimeZone(TimeZone.getTimeZone(timeZone));
String newZealandTime = formatter.format(calendar.getTime());
我希望这是有帮助的!
对我来说,最简单的方法是:
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
//Here you say to java the initial timezone. This is the secret
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
//Will print in UTC
System.out.println(sdf.format(calendar.getTime()));
//Here you set to your timezone
sdf.setTimeZone(TimeZone.getDefault());
//Will print on your default Timezone
System.out.println(sdf.format(calendar.getTime()));
与往常一样,我建议阅读这篇关于Java日期和时间的文章,以便你理解它。
基本的想法是,'发动机罩'下的所有事情都是以自世纪以来的UTC毫秒来完成的。 这意味着,如果您完全不使用时区进行操作,则最简单,除了用户的字符串格式设置外。
因此,我会跳过你建议的大部分步骤。
或者,您可以使用乔达时间。 我听说它是一个更直观的日期时间API。
链接地址: http://www.djcxy.com/p/3109.html