Java 从长时间戳获取纯时间元素

Java 从长时间戳获取纯时间元素,java,timestamp,Java,Timestamp,在我的java(实际上是Android,但在这里不相关)项目中,用户可以输入一些活动的开始和结束时间,系统会自动计算持续时间。按下按钮时,我使用System.currentTimeMillis()获取当前时间戳 出于本问题范围之外的原因,我需要丢弃时间戳的日期部分,只存储时间部分。简单,我想,只要除以一天中的毫秒数,取剩余的: long currentTimestamp = System.currentTimeMillis(); long timeOnly = currentTimeStamp

在我的java(实际上是Android,但在这里不相关)项目中,用户可以输入一些活动的开始和结束时间,系统会自动计算持续时间。按下按钮时,我使用
System.currentTimeMillis()
获取当前时间戳

出于本问题范围之外的原因,我需要丢弃时间戳的日期部分,只存储时间部分。简单,我想,只要除以一天中的毫秒数,取剩余的:

long currentTimestamp = System.currentTimeMillis();
long timeOnly = currentTimeStamp % (1000 * 60 * 60 * 24);
这几乎是可行的-除了它会在一小时后产生时间戳。下面是一个例子:

DateFormat timeFormat = DateFormat.getTimeInstance(DateFormat.SHORT, Locale.US);
long currentTimestamp = System.currentTimeMillis();
long timeOnly = currentTimestamp % (1000 * 60 * 60 * 24);
System.out.println("Full value: " + timeFormat.format(currentTimestamp));
System.out.println("Time only: " + timeFormat.format(timeOnly));
此代码打印:

Full value: 10:53 PM
Time only: 11:53 PM


Full value: 11:19 PM
Time only: 12:19 AM
虽然我可以从时间戳中减去一个小时,但我想真正了解发生这种情况的原因。

试试:

    Calendar calendar = Calendar.getInstance();
    calendar.setTime(new Date(System.currentTimeMillis()));
    calendar.set(Calendar.MONTH, 0);
    calendar.set(Calendar.YEAR, 0);
    calendar.set(Calendar.DAY_OF_MONTH, 0);

    System.out.println("Full value: " + timeFormat.format(currentTimestamp));
    System.out.println("Time only: " + timeFormat.format(calendar.getTimeInMillis()));
日历
实例将使用当前的
时区
,所有设置程序都将考虑时区的更改。因此,它应该起作用

注意


问题是,你为什么要这样做。您是否只想在数据库中存储时间信息,而不是存储“完整日期”?如果您想这样做,您可以将当前区域设置时间映射到UTC时间(而不是使用currentTimeMillis())。

我不确定。。。但我的直觉告诉我,这与时区有关。让我检查一下-我们现在在DTS中。。。这就解释了时间:)。您的currentTimeMillis是一个UNIX时间戳(在UTC中,您的计算可以工作…)。我会回来:)值得注意的是,我自己在英国,我们还没有进入DST。如果我使用
Locale.UK
add
timeFormat.setTimeZone(TimeZone.getTimeZone(“UTC”)),我会得到完全相同的结果你不会有什么不同。。。这当然是一个时区问题:)。
Locale
只是用于格式化,而不是时区。@Philipp-Hm,奇怪。时区在现在和1970年1月1日之间可能不同(虽然它确实不应该)。1970年1月1日是英国的夏季时间,但今天不是。好的,将日期设置为0/0/0是可行的。删除日期部分的原因是由于如何更改所选时间。用于更改时间的UI仅显示时间,但在更新时使用日期/时间对其进行更新。如果它是在另一个日期更新的,那么,比如说,间隔1小时,我将以1天加1小时结束-因此,我需要将所有内容正常化为同一天。最简单的方法就是删除日期。我认为你应该使用
日历
实现,如果你正在使用Java 8,那么看看,Java 8不是一个选项,因为我是专门为Android 4.2.2设备(内部客户端)编写的。哦,是的,我忘了你提到过。。。很抱歉