Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将当前时间转换为PST并与其他日期进行比较_Java_Android_Date_Simpledateformat - Fatal编程技术网

Java 将当前时间转换为PST并与其他日期进行比较

Java 将当前时间转换为PST并与其他日期进行比较,java,android,date,simpledateformat,Java,Android,Date,Simpledateformat,在我的一个模块中,我必须实现以下目标 我正在以yyyy-MM-dd'T'HH:MM:ss'Z'格式从服务器获取日期。我必须在PST中转换此日期和当前日期,然后以小时/分/秒为单位显示这两个日期之间的差异 为了将当前时间转换为PST,我编写了以下代码 Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("America/Los_Angeles")); Date currentLocalTime = ca

在我的一个模块中,我必须实现以下目标

我正在以yyyy-MM-dd'T'HH:MM:ss'Z'格式从服务器获取日期。我必须在PST中转换此日期和当前日期,然后以小时/分/秒为单位显示这两个日期之间的差异

为了将当前时间转换为PST,我编写了以下代码

        Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("America/Los_Angeles"));

        Date currentLocalTime = cal.getTime();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", LocaleManager.getLocale());


        TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles");
        format.setTimeZone(tz);
        String localTime = format.format(currentLocalTime);
        Date currentDate = format.parse(localTime);
在这里,当前时间被转换成字符串(localTime,在代码中),但当我解析此字符串以获取日期对象时,我只获取时区中的日期

我的问题是,若格式化程序在不同的时区格式化日期,那个么在解析为什么同一个日期并没有被转换成日期对象时


有没有其他方法可以在毫秒内获得两个日期(当前日期和从服务器收到的日期)之间的差异?

这里有很多问题,让我们看看:

  • Z
    。当您创建一个
    simpleDataFormat
    并将
    Z
    放在引号(
    'Z'
    )内时,您将其视为一个文本(字母Z本身),因此不要这样做
  • java.util.Date
    没有时区,但是这个类本身没有
因此,首先应该解析整个字符串,包括UTC信息。然后使用另一个格式化程序将其转换为另一个时区:

// parse the date/time with Z
SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
Date date = parser.parse("2018-03-21T10:00:00Z");

// convert to another timezone
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles");
format.setTimeZone(tz);
String formattedDate = format.format(date); // 2018-03-21T03:00:00-07:00
但是我建议您使用-看看如何在Android中使用它(或者只要使用java.time类,如果您的API级别有)

此API更好、更简单:

// parse input
Instant instant = Instant.parse("2018-03-21T10:00:00Z");

// convert to timezone
ZonedDateTime zdt = instant.atZone(ZoneId.of("America/Los_Angeles"));

DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssXXX");
System.out.println(zdt.format(fmt)); // 2018-03-21T03:00:00-07:00

这里有很多问题,让我们看看:

  • Z
    。当您创建一个
    simpleDataFormat
    并将
    Z
    放在引号(
    'Z'
    )内时,您将其视为一个文本(字母Z本身),因此不要这样做
  • java.util.Date
    没有时区,但是这个类本身没有
因此,首先应该解析整个字符串,包括UTC信息。然后使用另一个格式化程序将其转换为另一个时区:

// parse the date/time with Z
SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
Date date = parser.parse("2018-03-21T10:00:00Z");

// convert to another timezone
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles");
format.setTimeZone(tz);
String formattedDate = format.format(date); // 2018-03-21T03:00:00-07:00
但是我建议您使用-看看如何在Android中使用它(或者只要使用java.time类,如果您的API级别有)

此API更好、更简单:

// parse input
Instant instant = Instant.parse("2018-03-21T10:00:00Z");

// convert to timezone
ZonedDateTime zdt = instant.atZone(ZoneId.of("America/Los_Angeles"));

DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssXXX");
System.out.println(zdt.format(fmt)); // 2018-03-21T03:00:00-07:00
tl;博士 切勿使用
日期
日历
简化格式

ChronoUnit.MILLISECONDS.between( 
    Instant.parse( "2018-01-23T12:34:56Z" )  , 
    Instant.now() 
)
相反,使用java.time类

细节 答案是正确的

是否有其他方法可以以毫秒为单位获得两个日期(当前日期和从服务器收到的日期)之间的差异

是的,还有另一种方法,使用现代的java.time类

ISO 8601 您的输入是标准格式的。默认情况下,java.time类在解析/生成字符串时使用这些标准格式。因此,无需指定格式化模式

末尾的
Z
Zulu
的缩写,表示UTC。不要像在示例代码中那样忽略这一点

Instant
Instant
类以UTC为单位表示时间线上的一个瞬间,分辨率为纳秒

String input = "2018-01-23T12:34:56Z" ;
Instant instant = Instant.parse( input ) ;
您试图在
美国/洛杉矶
将UTC调整为分区时间,这是不必要的,也是不相关的。将时区应用于UTC值不会更改其在时间线上的位置,它只会更改挂钟时间。因此,一对UTC之间的运行时间与应用时区后的运行时间相同

经过的时间 要计算经过的时间,请使用
持续时间

Duration d = Duration.between( instant , otherInstant ) ;
我建议使用
Duration
来跟踪经过的时间,而不仅仅是毫秒数。但如果您坚持总毫秒数,请使用
ChronoUnit
enum

long millisElapsed = ChronoUnit.MILLISECONDS.between( instant , otherInstant ) ;
切勿使用设计拙劣的遗留类,如
Date
Calendar
SimpleDateFormat
。只使用它们的替代品java.time类,因为它们更干净、更简单,而且设计良好。

tl;博士 切勿使用
日期
日历
简化格式

ChronoUnit.MILLISECONDS.between( 
    Instant.parse( "2018-01-23T12:34:56Z" )  , 
    Instant.now() 
)
相反,使用java.time类

细节 答案是正确的

是否有其他方法可以以毫秒为单位获得两个日期(当前日期和从服务器收到的日期)之间的差异

是的,还有另一种方法,使用现代的java.time类

ISO 8601 您的输入是标准格式的。默认情况下,java.time类在解析/生成字符串时使用这些标准格式。因此,无需指定格式化模式

末尾的
Z
Zulu
的缩写,表示UTC。不要像在示例代码中那样忽略这一点

Instant
Instant
类以UTC为单位表示时间线上的一个瞬间,分辨率为纳秒

String input = "2018-01-23T12:34:56Z" ;
Instant instant = Instant.parse( input ) ;
您试图在
美国/洛杉矶
将UTC调整为分区时间,这是不必要的,也是不相关的。将时区应用于UTC值不会更改其在时间线上的位置,它只会更改挂钟时间。因此,一对UTC之间的运行时间与应用时区后的运行时间相同

经过的时间 要计算经过的时间,请使用
持续时间

Duration d = Duration.between( instant , otherInstant ) ;
我建议使用
Duration
来跟踪经过的时间,而不仅仅是毫秒数。但如果您坚持总毫秒数,请使用
ChronoUnit
enum

long millisElapsed = ChronoUnit.MILLISECONDS.between( instant , otherInstant ) ;

切勿使用设计拙劣的遗留类,如
Date
Calendar
SimpleDateFormat
。只使用它们的替代品java.time类,因为它们更干净、更简单,而且设计良好。

回答得好。但仅供参考,你在最后定义的模式已经被预先定义好了:或者两个答案(巴兹尔和你的)都是正确的,对我帮助很大,很难选择。我正在选择另一个和它给我的答案一样正确的答案