如何在java中创建具有默认GMT小时数的日历
我从服务器得到一个长消息,我必须将它解析为一个日期。我用日历来做这件事 问题是,long是从服务器转换而来的(它有用户本地时间),但我将它作为默认的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
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显示它(因为它已经被转换),它应该显示正确。它可以工作。谢谢,把它作为答案贴出来!