如何将日期时间从一个时区转换为另一个时区
记录将根据美国的时区保存,但如果我想向用户显示相同的记录,则应将服务器日期时间(美国时区)转换为用户的时区的用户日期时间
如果您输入谷歌“Java日期更改时区”或“Javascript日期更改时区”。 您将得到一个结果:
在Java中(来源: http : //www.coderanch.com/t/417443/java/java/Convert-Date-one-timezone-another )
Date date = new Date(); DateFormat formatter = new SimpleDateFormat("dd MMM yyyy HH:mm:ss z"); formatter.setTimeZone(TimeZone.getTimeZone("CET")); // Prints the date in the CET timezone System.out.println(formatter.format(date)); // Set the formatter to use a different timezone formatter.setTimeZone(TimeZone.getTimeZone("IST")); // Prints the date in the IST timezone System.out.println(formatter.format(date));
Javascript(来源: http : //www.techrepublic.com/article/convert-the-local-time-to-another-time-zone-with-this-javascript/6016329 )
// function to calculate local time // in a different city // given the city's UTC offset function calcTime(city, offset) { // create Date object for current location d = new Date(); // convert to msec // add local time zone offset // get UTC time in msec utc = d.getTime() + (d.getTimezoneOffset() * 60000); // create new Date object for different city // using supplied offset nd = new Date(utc + (3600000*offset)); // return time as a string return "The local time in " + city + " is " + nd.toLocaleString(); } // get Bombay time alert(calcTime('Bombay', '+5.5'));
java.time
旧的日期时间类设计糟糕,令人困惑,麻烦。 避免他们。
使用现代类:Java 8及更高版本中内置的java.time框架。 查找早期Java 6和7以及Android的后端口。
Instant
是UTC时间轴上的一个时刻。
Instant now = Instant.now();
应用时区( ZoneId
)以获取ZonedDateTime
。
切勿使用3-4个字母区域缩写,例如EST
或IST
。 它们既不标准也不独特(!)。 使用适合的时区名称 ,以Asia/Kolkata
, Pacific/Auckland
, America/Los_Angeles
等continent/region
格式构建。
ZoneId zoneId_Montreal = ZoneId.of( "America/Montreal" ); ZonedDateTime zdt_Montreal = ZonedDateTime.ofInstant( instant , zoneId_Montreal );
应用不同的时区以生成调整到该时区的另一个ZonedDateTime
。 使用withZoneSameInstant
调用。
ZoneId zoneId_Paris = ZoneId.of( "Europe/Paris" ); // Or "Asia/Kolkata", etc. ZonedDateTime zdt_Paris = zdt_Montreal.withZoneSameInstant( zoneId_Paris );
如果您想返回UTC ,请求Instant
。
Instant instant = zdt_Paris.toInstant();
TimeZone fromTimezone =TimeZone.getTimeZone(from); TimeZone toTimezone=TimeZone.getTimeZone(to); long fromOffset = fromTimezone.getOffset(calendar.getTimeInMillis()); long toOffset = toTimezone.getOffset(calendar.getTimeInMillis()); long convertedTime = calendar.getTimeInMillis() - (fromOffset - toOffset);
//Convert date from one zone to another /* $zone_from='Asia/Kolkata'; $zone_to='America/Phoenix'; date_default_timezone_set($zone_from); $convert_date="2016-02-26 10:35:00"; echo $finalDate=zone_conversion_date($convert_date, $zone_from, $zone_to); */ function zone_conversion_date($time, $cur_zone, $req_zone) { date_default_timezone_set("GMT"); $gmt = date("Ymd H:i:s"); date_default_timezone_set($cur_zone); $local = date("Ymd H:i:s"); date_default_timezone_set($req_zone); $required = date("Ymd H:i:s"); /* return $required; */ $diff1 = (strtotime($gmt) - strtotime($local)); $diff2 = (strtotime($required) - strtotime($gmt)); $date = new DateTime($time); $date->modify("+$diff1 seconds"); $date->modify("+$diff2 seconds"); return $timestamp = $date->format("Ymd H:i:s"); }
代码获取柏林时间并将其转换为UTC时间
Calendar sc = Calendar.getInstance(TimeZone.getTimeZone("Europe/Berlin")); String strt = null; SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'"); sf.setTimeZone(TimeZone.getTimeZone("Etc/UTC")); sc.set(sc.get(Calendar.YEAR),sc.get(Calendar.MONTH), sc.get(Calendar.DATE),sc.get(Calendar.HOUR) , sc.get(Calendar.MINUTE)); strt = sf.format(sc.getTime()); System.out.println("Start :"+strt);