将时间更改为特定时区的最简单方法
Posted
技术标签:
【中文标题】将时间更改为特定时区的最简单方法【英文标题】:the simplest way to change a time to particular timezone 【发布时间】:2012-09-07 02:26:44 【问题描述】:有两个字符串
String date = "9/13/2012";
String time = "5:48pm";
时间是 GMT+0,我想把它改成 GMT+8,把时间改成特定时区的最简单方法是什么
【问题讨论】:
【参考方案1】: 使用设置为 UTC 时区的SimpleDateFormat
解析它
使用设置为您感兴趣的时区的SimpleDateFormat
格式化解析的Date
值。(它可能不仅仅是“UTC+8” - 您应该找出哪个 TZDB 时区 ID你真的想要。
例如:
SimpleDateFormat inputFormat = new SimpleDateFormat("MM/dd/yyyy h:mma", Locale.US);
inputFormat.setTimeZone(TimeZone.getTimeZone("Etc/UTC");
Date date = inputFormat.parse(date + " " + time);
// Or whatever format you want...
SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.US);
outputFormat.setTimeZone(targetTimeZone);
String outputText = outputFormat.format(date);
(如果您可以改用 Joda Time,那就太好了 - 但我知道它对于 android 应用程序来说相当大。)
【讨论】:
【参考方案2】:Joda-Time 库提供了一组很好的对象,用于处理多个时区中的日期/时间。 http://joda-time.sourceforge.net/
例如这样的:
String date = "9/13/2012";
String time = "5:48pm";
String[] dateParts = date.split("/");
Integer month = Integer.parseInt(dateParts[0]);
Integer day = Integer.parseInt(dateParts[1]);
Integer year = Integer.parseInt(dateParts[2]);
String[] timeParts = time.split(":");
Integer hour = Integer.parseInt(timeParts[0]);
Integer minutes = Integer.parseInt(timeParts[1].substring(0,timeParts[1].lastIndexOf("p")));
DateTime dateTime = new DateTime(year, month, day, hour, minutes, DateTimeZone.forID("Etc/GMT"));
dateTime.withZone(DateTimeZone.forID("Etc/GMT+8"));
【讨论】:
【参考方案3】:java.time
java.util
日期时间 API 及其格式化 API SimpleDateFormat
已过时且容易出错。建议完全停止使用,改用modern Date-Time API*。
另外,下面引用的是来自home page of Joda-Time的通知:
请注意,从 Java SE 8 开始,用户被要求迁移到 java.time (JSR-310) - JDK 的核心部分,它取代了这个项目。
使用现代日期时间 API java.time
的解决方案:
import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main
public static void main(String[] args)
String date = "9/13/2012";
String time = "5:48pm";
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("M/d/u h:ma", Locale.UK);
LocalDateTime ldtSource = LocalDateTime.parse(date + " " + time, dtf);
OffsetDateTime odtSource = ldtSource.atOffset(ZoneOffset.UTC);
OffsetDateTime odtTarget = odtSource.withOffsetSameInstant(ZoneOffset.of("+08:00"));
System.out.println(odtTarget);
// In a custom format
System.out.println(odtTarget.format(dtf));
输出:
2012-09-14T01:48+08:00
9/14/2012 1:48am
ONLINE DEMO
从 Trail: Date Time 了解有关现代日期时间 API 的更多信息。
* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 和 7 . 如果您正在为一个 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring 和 How to use ThreeTenABP in Android Project。
【讨论】:
以上是关于将时间更改为特定时区的最简单方法的主要内容,如果未能解决你的问题,请参考以下文章