我有一个int 1446159600,它是UTC / GMT日期星期四,2015年10月29日23:00:00 GMT。我尝试转换为实际的UTC日期,但无法使用Calendar,SimpleDateFormat和Timezone类。有人能帮助我吗?
答案 0 :(得分:1)
Instant.ofEpochSecond ( 1_446_159_600L )
2015-10-29T23:00:00Z
You appear to have an integer count-from-epoch counting whole seconds with an epoch of Unix time, the first moment of 1970 in UTC.
The old date-time classes you reference are based on milliseconds. So multiply by 1,000.
Even better, avoid those old classes altogether. The new java.time framework in Java 8 and later is a vast improvement, supplanting those old classes. See Tutorial. These new classes have a resolution of nanoseconds, or 9 decimal places in a fraction of a second.
The Instant
class (a moment on the timeline in UTC) even has a handy ofEpochSecond
method, so no need to multiply by a thousand.
long wholeSecondsFromEpochInUtc = 1_446_159_600L;
Instant instant = Instant.ofEpochSecond ( wholeSecondsFromEpochInUtc );
That solves your Question in a one-liner.
We can go further. Apply a time zone to that Instant to get a ZonedDateTime
.
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime ( FormatStyle.FULL ).withLocale ( Locale.CANADA_FRENCH );
String output = zdt.format ( formatter );
Dump to console.
System.out.println ( "instant (UTC): " + instant );
System.out.println ( "zdt: " + zdt );
System.out.println ( "output: " + output );
instant (UTC): 2015-10-29T23:00:00Z
zdt: 2015-10-29T19:00-04:00[America/Montreal]
output: jeudi 29 octobre 2015 19 h 00 EDT
答案 1 :(得分:0)
实际上1446159600毫秒是"星期六1月17日23:12:39 IST 1970"。 IST是我当地的时间。
但是,您可以使用Calendar对象获取关联日期,如下所示。
Calendar cal = new GregorianCalendar();
cal.setTimeInMillis(1446159600 );
System.out.println(cal.getTime());
并且,这个输出恰好是"周六1月17日23:12:39 IST 1970"
另外,如果要将毫秒转换为日期,可以使用http://currentmillis.com/ 它给出了与给定毫秒相关的日期。
答案 2 :(得分:0)
也许我误解了这个问题,但这会从当前时间以毫秒为单位创建一个日期:
public class DateTime
{
public static void main (String[] args)
{
long time = System.currentTimeMillis ();
System.out.println (time);
Date date = new Date (time);
System.out.println (date);
}
}
输出:
1446191239738
Fri Oct 30 18:47:19 AEDT 2015
答案 3 :(得分:0)
// print the time in local time zone
Date date = new Date(1446159600);
System.out.println(date);
// print UTC time
TimeZone utcTimeZone = TimeZone.getTimeZone("UTC");
Calendar calendar = Calendar.getInstance(utcTimeZone);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
"EE MMM dd HH:mm:ss zzz yyyy", Locale.US);
simpleDateFormat.setTimeZone(utcTimeZone);
calendar.setTimeInMillis(date.getTime());
System.out.println(simpleDateFormat.format(calendar.getTime()));
//print in local time zone
//Because getTime method actully call new Date(long millsecond);
/* public final Date getTime() {
return new Date(getTimeInMillis());
}*/
System.out.println(calendar.getTime());
答案 4 :(得分:0)
时间戳似乎是以秒为单位,而大多数java使用毫秒,所以我们必须乘以1000。
long timestampMilliseconds = 1446159600*1000L;
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z", Locale.US);
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
String stringDate = simpleDateFormat.format(new Date(timestampMilliseconds));
System.out.println(stringDate); // Thu, 29 Oct 2015 23:00:00 GMT
1000之后的L是使得乘法作为长值完成,并且该数字不会溢出整数最大值。您可以使用((long)1446159600)*1000
,1446159600L*1000
或其他任何内容来获得相同的效果。您也可以使用TimeUnit.SECONDS.toMillis(1446159600)
。
答案 5 :(得分:0)
签出此代码:
// Make a format for showing the date
DateFormat dateFormat = new SimpleDateFormat("dd MMM, yyy", Locale.FRANCE);
// Make a format for showing the time
DateFormat timeFormat = new SimpleDateFormat("hh:mm a", Locale.FRANCE);
// Get the current time in UTC (in milliseconds since 01 Jan 1970)
Long currentUTCDate = Calendar.getInstance().getTimeInMillis();
// Convert the current time from UTC to normal date
Date currentDate = new Date(currentUTCDate);
// Take the date only from currentDate object using the dateFormat we made before
// and pass it to currentDateOnly String
String currentDateOnly = dateFormat.format(currentDate);
// Do the same with the time
String currentTimeOnly = timeFormat.format(currentDate);
在此代码中,我们可以区分三个主要的不同类:
1. SimpleDateFormat()
,它返回类型为DateFormat
的对象
2. Calendar
,其中一种方法是getTimeInMillis()
3. Date
,它使对象可以保存您给它的时间的所有详细信息
现在:
。 getTimeInMillis()
返回一个Long类型的数字,该数字保存自1970年1月1日以来的当前毫秒数。
我们使用这种类型的时间来简化具有日期的计算。
。在Date
类中,我们有一个构造函数,该构造函数将getTimeInMillis()
中的Long数字作为参数,并为我们返回Date
类型的对象,该对象包含我们赋予它的时间的每个细节在构造函数中。
。现在,我们不需要对象currentDate
拥有的所有详细信息,因此我们制作了一个过滤器,仅从currentDate
对象获取日期和时间,并使用了{{ 1}}。
。制作类型为DateFormat
的对象,我们使用DateFormat
构造函数,并将SimpeDateFormat()
作为要获取的特定parameter
的{{1}}传递给它来自我们的String
对象,例如(“ dd MMM,yyy”),它在我们的代码中:
pattern
。最后,我们将currentDate
对象作为DateFormat dateFormat = new SimpleDateFormat("dd MMM, yyy", Locale.FRANCE);
方法的currentDate
对象,该方法将向我们返回一个字符串,该字符串的过滤日期与我们提供的模式相同,在我们的示例中paremeter
,结果将类似于:
dateFormat.format()