Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.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 System.currentTimeMillis()不显示UTC时间,而是显示当前时区时间_Java - Fatal编程技术网

Java System.currentTimeMillis()不显示UTC时间,而是显示当前时区时间

Java System.currentTimeMillis()不显示UTC时间,而是显示当前时区时间,java,Java,我需要获得UTC时间,因此在许多地方我使用下面的代码来计算UTC时间 System.currentTimeMillis() ; IST-(GMT+5:30)中的Iam System.currentTimeMillis()应显示UTC时间(IST-5:30),而不是当前时间(GMT+5:30)。 我不想使用ApacheofJoda日期和时间api。我想使用javaapi-itslef。帮助我解决问题。System.currentTimeMillis()只返回一个long-它不是任何类型的日期格式

我需要获得UTC时间,因此在许多地方我使用下面的代码来计算UTC时间

System.currentTimeMillis() ;
IST-(GMT+5:30)中的Iam System.currentTimeMillis()应显示UTC时间(IST-5:30),而不是当前时间(GMT+5:30)。
我不想使用ApacheofJoda日期和时间api。我想使用javaapi-itslef。帮助我解决问题。

System.currentTimeMillis()
只返回一个
long
-它不是任何类型的日期格式

如果您实际正在使用:

Date date = new Date(System.currentTimeMillis());
System.out.println(date);
然后您将看到
Date.toString()
的结果,它始终使用系统默认时区

使用
DateFormat
(例如
SimpleDateFormat
)指定要使用的日历系统(通常为公历)、时区和格式。例如:

Date date = ...;
DateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss",
                                         Locale.US);
format.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));

String result = format.format(date);
另一方面,我强烈建议将“获取当前时间”的概念抽象到一个接口中,您可以在一种情况下使用
System.currentTimeMillis()
(或者等效地,仅使用
new Date()
)实现该接口,但为了测试目的,可以使用您可以随意设置和更新的值来实现。然后将这个“时钟”接口注入任何需要访问当前日期/时间的东西中。它使测试基于时间的组件变得更加容易


(如果可能的话,我还强烈建议使用Joda Time或java 8中的
java.Time
包。我知道你说过你不想这样做,但我怀疑这是因为你没有像我们中的一些人那样花那么多时间在
java.util.Date
java.util.Calendar
上咒骂。这两种选择都会导致很多问题。)更干净的代码,更易于阅读和推理。如果您试图避免一次性将Joda时间投入到构建过程中,请将其与您可能花费的维护代码的时间进行权衡。或者只更新到Java 8…Java 7很快将失去免费更新支持…)
System.currentTimeMillis()
只返回一个
长的
——它不是任何类型的日期格式

如果您实际正在使用:

Date date = new Date(System.currentTimeMillis());
System.out.println(date);
然后您将看到
Date.toString()
的结果,它始终使用系统默认时区

使用
DateFormat
(例如
SimpleDateFormat
)指定要使用的日历系统(通常为公历)、时区和格式。例如:

Date date = ...;
DateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss",
                                         Locale.US);
format.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));

String result = format.format(date);
另一方面,我强烈建议将“获取当前时间”的概念抽象到一个接口中,您可以在一种情况下使用
System.currentTimeMillis()
(或者等效地,仅使用
new Date()
)实现该接口,但为了测试目的,可以使用您可以随意设置和更新的值来实现。然后注入此“时钟”接口到需要访问当前日期/时间的任何内容中。它使测试基于时间的组件变得更加容易


(如果可能的话,我还强烈建议使用Joda Time或java 8中的
java.Time
包。我知道你说过你不想这样做,但我怀疑这是因为你没有像我们中的一些人那样花那么多时间在
java.util.Date
java.util.Calendar
上咒骂。这两种选择都会导致很多问题。)更干净的代码,更易于阅读和推理。如果您试图避免一次性将Joda时间投入到构建过程中,请将其与您可能花费的维护代码的时间进行权衡。或者只更新到Java 8…Java 7很快将失去免费更新支持…)因此,我有以下日期类代码:public static date getUTCDate(long utcTime){date localDate=new date(utcTime);String format=“yyyy/MM/dd HH:MM:ss”;SimpleDateFormat sdf=new SimpleDateFormat(format);sdf.setTimeZone(TimeZone.getTimeZone(“UTC”);date utcDate=new date(sdf.format(localDate));return utcDate;}并且我的服务器在CST时区,如果我调用代码“getUTCDate(System.currentTimeMillis)”它会显示正确的UTC日期或时间。在这方面给我的建议是,如果iam在中美洲CST,并且如果我使用系统。currentTimeMillis()-它会显示CST长时间(UTC-6:00)或UTC长时间(CST+6:00)@SrivathsanSrinivasan:如果你的方法要返回一个
日期
,你为什么要把它转换成一个字符串呢?你知道
日期
对象没有时区的概念吗?它只是unix纪元以来的毫秒数。调用上面的方法不会显示任何东西-它会创建一个新的
日期
,然后格式化它,然后解析它-没有明显的原因。我的基本想法是,通过将sys.currTimeMillis(当前CST长时间)传递到上面的方法,正如您所描述的,将以UTC格式给我一个时间。@srivathsansarinivasan:您误解了一切的含义。
System.currentTimeMillis()
不会返回“Current CST long time”(当前CST long time)——它返回自Unix纪元以来的毫秒数。这不在任何特定的时区——在世界上任何地方都会得到相同的结果。(如果现在运行它,将得到与我现在运行它相同的结果。)类似地,
Date
只是自unix时代以来若干天的包装器。如果您想要一个表示特定时区中日期/时间的对象,则需要
java.util.Calendar
。如果您只想将其作为字符串,请使用
DateFormat
。因此,我有以下日期类code
public static Date getUTCDate(long utcTime){Date localDate=new Date(utcTime);String format=“yyyy/MM/dd HH:MM:ss”;SimpleDateFormat sdf=new SimpleDateFormat(format);sdf.setTimeZone(TimeZone.getTimeZone(“UTC”);Date utcDate=new Date(sdf.format(localDate));return utcDate}
并且如果我调用代码“getUTCDate”,我的服务器处于CST时区(System.cur)