将UTC日期转换为毫秒

Tyr*_*ick 8 java time utc milliseconds

我对当前的UTC时间毫秒不感兴趣,也不需要弄乱时区.我的原始日期已存储为UTC时间戳.

我在UTC时间存储在数据库中的日期,"2012-06-14 05:01:25".我对日期时间不感兴趣,只是它的日期部分.因此,在用Java检索日期并排除小时,分钟和秒后 - 我留下了"2012-06-14".

如何将其转换为UTC毫秒?

Jon*_*eet 12

编辑:我错过了"忽略一天中的时间"部分.它现在存在,但接近结束......

最简单的方法可能是使用SimpleDateFormat,适当设置时区:

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US);
format.setTimeZone(TimeZone.getTimeZone("UTC"));

Date date = format.parse(text);
long millis = date.getTime();
Run Code Online (Sandbox Code Playgroud)

(此处设置时区是重要的位,否则它会将值解释为在本地时区.)

或者,如果您正在做一些不那么简单的事情,请使用Joda Time,这是一个更好的日期/时间API.特别是,SimpleDateFormat 它不是线程安全的,DateTimeFormatter而是:

// This can be reused freely across threads after construction.
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")
    .withLocale(Locale.US)
    .withZoneUTC();

// Option 1
DateTime datetime = formatter.parseDateTime(text);
long millis = dateTime.getMillis();

// Option 2, more direct, but harder to diagnose errors
long millis = formatter.parseMillis(text);
Run Code Online (Sandbox Code Playgroud)

到目前为止,我们已经解析了整个整体架子.忽略日期部分的最简单方法就是将其四舍五入 - 毕竟,Java没有观察到闰秒,所以我们可以截断它:

long millisPerDay = 24L * 60L * 60L * 1000L; // Or use TimeUnit
long dayMillis = (millis / millisPerDay) * millisPerDay;
Run Code Online (Sandbox Code Playgroud)

这将"向1970 年前进 ",所以如果你 1970年之前有一个日期,它将会到达当天结束 - 但我怀疑这不太可能成为一个问题.

使用Joda Time版本,您可以使用它:

DateTime dateTime = formatter.parseDateTime(text);
long millis = dateTime.toLocalDate().getLocalMillis();
Run Code Online (Sandbox Code Playgroud)

我个人不会考虑只是采取一个子串.即使你实际上并不想保留小时/分钟/秒,我认为解析你所获得的内容然后扔掉信息是合适的.除了其他任何东西,它会使你的代码在错误的数据中适当地失败,例如

"2012-06-100"
Run Code Online (Sandbox Code Playgroud)

要么

"2012-06-14 25:01:25"
Run Code Online (Sandbox Code Playgroud)

表明在为你提供数据的任何问题上都存在问题,并且发现它是好的,而不是盲目地继续,因为前10个字符是可以的.

  • @PeterLawrey:我在帖子的末尾反对子串调用. (2认同)