将时间更改为特定时区的最简单方法



有两个字符串

String date = "9/13/2012";
String time = "5:48pm";

时间是GMT+0,我想把它改成GMT+8,把时间改成特定时区的最简单方法是什么?

  • 使用设置为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应用程序来说相当大。)

Joda时间库为处理多个时区的日期/时间提供了一组很好的对象。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"));

java.time

java.util日期-时间API及其格式API、SimpleDateFormat已过时且存在错误。建议完全停止使用它们,并切换到现代日期时间API*

此外,下面引用的是Joda Time主页上的通知:

注意,从JavaSE8开始,用户被要求迁移到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

在线演示

跟踪:日期时间了解有关现代日期时间API的更多信息。


*无论出于何种原因,如果您必须坚持使用Java 6或Java 7,您可以使用ThreeTen BackportJava.time的大部分功能向后移植到Java 6&7.如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请检查通过desugaring和如何在Android项目中使用ThreeTenABP提供的Java 8+API。

相关内容

  • 没有找到相关文章

最新更新