【发布时间】:2011-11-26 11:38:56
【问题描述】:
我有一个应用程序,它需要以秒为单位比较时间。
我想知道如何以秒为单位获取当前的 UTC 时间。
有人可以发布一个示例,我们如何在 Java 中做到这一点?
【问题讨论】:
我有一个应用程序,它需要以秒为单位比较时间。
我想知道如何以秒为单位获取当前的 UTC 时间。
有人可以发布一个示例,我们如何在 Java 中做到这一点?
【问题讨论】:
要将日期存储为整数而不是长整数,您可以除以 1000 并选择减去另一个日期,例如 2019 年 1 月 1 日:
private int getUTC()
{
Calendar cal1 = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
cal1.set(2019, 1, 1);
long millis1 = cal1.getTimeInMillis();
//Current date in milliseconds
long millis2 = TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis());
// Calculate difference in seconds
long diff = millis2 - millis1;
return (int)(diff / 1000);
}
【讨论】:
以秒为单位获取当前 UTC 时间(自 1.5 起):
TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis())
根据 Javadoc:
http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/System.html#currentTimeMillis
返回:
当前时间和当前时间之间的差异,以毫秒为单位 UTC 时间 1970 年 1 月 1 日午夜。
【讨论】:
Joda 让一切变得简单
import org.joda.time.ReadableInstant;
import org.joda.time.DateTime;
import static org.joda.time.DateTimeZone.UTC;
import static org.joda.time.Seconds.secondsBetween;
...
ReadableInstant start = new DateTime("2011-01-01", UTC);
ReadableInstant end = new DateTime("2011-02-02", UTC);
int secondsDifference = secondsBetween(start, end).getSeconds();
【讨论】:
这行得通:
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
GregorianCalendar gregorianCalendar = new GregorianCalendar
(
calendar.get(Calendar.YEAR),
calendar.get(Calendar.MONTH),
calendar.get(Calendar.DAY_OF_MONTH),
calendar.get(Calendar.HOUR_OF_DAY),
calendar.get(Calendar.MINUTE),
calendar.get(Calendar.SECOND)
);
return gregorianCalendar.getTime();
【讨论】:
public static long getUtcTime(long time) {
System.out.println("Time="+time);
SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
Date dbefore=new Date(time);
System.out.println("Date before conversion="+format.format(dbefore));
Calendar c = Calendar.getInstance();
c.setTimeInMillis(time);
TimeZone timezone = c.getTimeZone();
int offset = timezone.getRawOffset();
if(timezone.inDaylightTime(new Date())){
offset = offset + timezone.getDSTSavings();
}
int offsetHrs = offset / 1000 / 60 / 60;
int offsetMins = offset / 1000 / 60 % 60;
System.out.println("offset: " + offsetHrs);
System.out.println("offset: " + offsetMins);
c.add(Calendar.HOUR_OF_DAY, (-offsetHrs));
c.add(Calendar.MINUTE, (-offsetMins));
System.out.println("Date after conversion: "+format.format(c.getTime()));
System.out.println("Time converted="+c.getTime().getTime());
return c.getTime().getTime();
}
【讨论】:
您可以使用它来获取时区在您想要返回的时区中传递
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
然后你可以在日历对象上调用任何你想要的东西
System.out.println(cal.get(Calendar.YEAR));
System.out.println(cal.get(Calendar.HOUR));
System.out.println(cal.get(Calendar.HOUR_OF_DAY));
System.out.println(cal.get(Calendar.MINUTE));
以下示例以秒为单位比较两个日历
Calendar cal1 = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
Calendar cal2 = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
// Set the dates for calendars
cal1.set(2011, 1, 1);
cal2.set(2011, 2, 2);
// Get the represented date in milliseconds as a long
long milis1 = cal1.getTimeInMillis();
long milis2 = cal2.getTimeInMillis();
// Calculate difference in milliseconds
long diff = milis2 - milis1;
// Calculate difference in seconds
long diffSecs = diff / 1000;
System.out.println("In seconds: " + diffSecs + " seconds");
【讨论】:
System.out.println(cal.get(Calendar.SECOND)); 只要知道这是一个从0到59的数字;您将不得不使用整个 Calendar 对象进行比较。
【讨论】:
currentTimeMillis 是 UTC。请参阅 Javadocs:返回:当前时间与 UTC 1970 年 1 月 1 日午夜之间的差异,以毫秒为单位。 docs.oracle.com/javase/6/docs/api/java/lang/…
System.out.println(new Date());
Date.toString()(你隐式调用)是作弊 - 它会在你当地的时区打印日期(我也被这个绊倒了)。存储在 Date 实例中的时间戳采用 UTC。如果您还有其他问题,请随时提出单独的问题 :-)。