Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.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中创建具有默认GMT小时数的日历_Java_Android_Date_Calendar_Datetime Format - Fatal编程技术网

如何在java中创建具有默认GMT小时数的日历

如何在java中创建具有默认GMT小时数的日历,java,android,date,calendar,datetime-format,Java,Android,Date,Calendar,Datetime Format,我从服务器得到一个长消息,我必须将它解析为一个日期。我用日历来做这件事 问题是,long是从服务器转换而来的(它有用户本地时间),但我将它作为默认的GMT,并将其转换为本地时间 所以,它变换了两次。既然我做对了,我如何在不将其更改为本地的情况下显示它(默认情况下似乎这样做)?我的代码: Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT")); calendar.setTimeInMillis

我从服务器得到一个长消息,我必须将它解析为一个日期。我用日历来做这件事

问题是,long是从服务器转换而来的(它有用户本地时间),但我将它作为默认的GMT,并将其转换为本地时间

所以,它变换了两次。既然我做对了,我如何在不将其更改为本地的情况下显示它(默认情况下似乎这样做)?我的代码:

Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));           
calendar.setTimeInMillis(dateLong);
SimpleDateFormat format1 = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
format1.format(cal.getTime());
对不起,我误解了 我猜你有毫秒的时间。那么从那以后呢,

Date dateCreated = new Date(timeInMilliseconds);
然后,当您创建日历时,只需在设置时间之后设置时区,因为在创建实例时,setTimeInMillis将覆盖您以前设置的时区

Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(new java.util.Date().getTime());
calendar.setTimeZone(TimeZone.getTimeZone("GMT"));
就这样

对不起,我误解了 我猜你有毫秒的时间。那么从那以后呢,

Date dateCreated = new Date(timeInMilliseconds);
然后,当您创建日历时,只需在设置时间之后设置时区,因为在创建实例时,setTimeInMillis将覆盖您以前设置的时区

Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(new java.util.Date().getTime());
calendar.setTimeZone(TimeZone.getTimeZone("GMT"));

就是这样

而不是使用
日历
使用
简化格式
。下面的代码显示了正确的结果

    SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
    df.setTimeZone(TimeZone.getTimeZone("GMT"));
    String result = df.format(dateLong);
    System.out.println(result);

不要使用
日历
使用
SimpleDateFormat
。下面的代码显示了正确的结果

    SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
    df.setTimeZone(TimeZone.getTimeZone("GMT"));
    String result = df.format(dateLong);
    System.out.println(result);

其他答案已经提供了
Calendar
SimpleDateFormat
的解决方案。我只想补充另一种方法

旧类(
Date
Calendar
SimpleDateFormat
)具有和,它们正在被新的API所取代

在Android中(如果您对向项目添加依赖项没有意见——在本例中,这是完全值得的,IMO),您可以使用,这是java8新的日期/时间类的一个很好的后端口。要使它工作,您还需要(更多关于如何使用它的信息)

首先,您可以使用
org.threeten.bp.Instant
将毫秒值转换为相应的UTC瞬时值。然后使用
org.threeten.bp.format.DateTimeFormatter
来定义日期所需的格式。我还使用
org.threeten.bp.ZoneOffset
指示格式化程序应使用UTC中的日期:

long dateLong = System.currentTimeMillis();
// convert long millis value to Instant
Instant instant = Instant.ofEpochMilli(dateLong);
// create formatter in UTC
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss")
    .withZone(ZoneOffset.UTC);
// format it
System.out.println(fmt.format(instant));
输出类似于:

2017年9月13日11:28:02


其他答案已经提供了
Calendar
SimpleDateFormat
的解决方案。我只想补充另一种方法

旧类(
Date
Calendar
SimpleDateFormat
)具有和,它们正在被新的API所取代

在Android中(如果您对向项目添加依赖项没有意见——在本例中,这是完全值得的,IMO),您可以使用,这是java8新的日期/时间类的一个很好的后端口。要使它工作,您还需要(更多关于如何使用它的信息)

首先,您可以使用
org.threeten.bp.Instant
将毫秒值转换为相应的UTC瞬时值。然后使用
org.threeten.bp.format.DateTimeFormatter
来定义日期所需的格式。我还使用
org.threeten.bp.ZoneOffset
指示格式化程序应使用UTC中的日期:

long dateLong = System.currentTimeMillis();
// convert long millis value to Instant
Instant instant = Instant.ofEpochMilli(dateLong);
// create formatter in UTC
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss")
    .withZone(ZoneOffset.UTC);
// format it
System.out.println(fmt.format(instant));
输出类似于:

2017年9月13日11:28:02


我不明白,这个字符串的结果是:2017-09-13T12:44:20我想我理解错了。所以,你有一个以毫秒为单位的日期对象(这就是为什么你用长值表示),然后你想做什么?因为当你创建一个新的日期(timeinmillizes)时,这个日期已经用时区值创建了,所以我从服务器得到了long,但是我认为pass转换成了用户的本地时区。然而,我得到的是GMT,并将其再次转换为用户的本地时区。所以,它比它必须的多2小时。由于我是从服务器转换过来的,我如何才能在不再次转换的情况下显示它(默认情况下,日历时区是用户时区,因此它会转换日期)。我试过Calendar.getInstance(TimeZone.getTimeZone(“GMT”)),它不起作用。不起作用,但他们给了我答案。我必须更改DateFormatter时区。无论如何,谢谢。我不明白,这个字符串的结果是:2017-09-13T12:44:20ZI认为我理解错了。所以,你有一个以毫秒为单位的日期对象(这就是为什么你用长值表示),然后你想做什么?因为当你创建一个新的日期(timeinmillizes)时,这个日期已经用时区值创建了,所以我从服务器得到了long,但是我认为pass转换成了用户的本地时区。然而,我得到的是GMT,并将其再次转换为用户的本地时区。所以,它比它必须的多2小时。由于我是从服务器转换过来的,我如何才能在不再次转换的情况下显示它(默认情况下,日历时区是用户时区,因此它会转换日期)。我试过Calendar.getInstance(TimeZone.getTimeZone(“GMT”)),它不起作用。不起作用,但他们给了我答案。我必须更改DateFormatter时区。无论如何,谢谢。要正确理解您的问题,您希望时间是“GMT”还是您的本地时间(不更改)?@Dellautiator是GMT。我是在本地时间从服务器获取的,但它在GMT中检测到它并再次转换。所以,如果我用GMT显示它(因为它已经被转换),它应该显示正确。它可以工作。谢谢,把它作为答案贴出来!要正确理解您的问题,您希望时间是“GMT”还是您的本地时间(不更改)?@Dellautiator是GMT。我从服务器获取的时间是本地时间,但它会在GMT中检测到时间并再次转换。所以,如果我用GMT显示它(因为它已经被转换),它应该显示正确。它可以工作。谢谢,把它作为答案贴出来!