datetime如何使用Java计算相对时间跨度(代码转换问题)?
我决定在实现this question's成就的Java上给自己一个挑战
我必须做的事情是获取LocalDateTime
,从链接问题的答案转换相同的代码,然后从函数接收字符串
以下是我迄今为止所做的工作:
public static String relTime(LocalDateTime now)
{
// accepted answer converted to Java
const int min = 60 * SECOND;
const int hour = 60 * MINUTE;
const int day = 24 * HOUR;
const int mon = 30 * DAY;
// still don't know how to convert this method
var ts = new TimeSpan(DateTime.UtcNow.Ticks - yourDate.Ticks);
double delta = Math.Abs(ts.TotalSeconds);
if (delta < 1 * MINUTE)
return ts.Seconds == 1 ? "one second ago" : ts.Seconds + " seconds ago";
if (delta < 2 * MINUTE)
return "a minute ago";
if (delta < 45 * MINUTE)
return ts.Minutes + " minutes ago";
if (delta < 90 * MINUTE)
return "an hour ago";
if (delta < 24 * HOUR)
return ts.Hours + " hours ago";
if (delta < 48 * HOUR)
return "yesterday";
if (delta < 30 * DAY)
return ts.Days + " days ago";
if (delta < 12 * MONTH)
{
int months = Convert.ToInt32(Math.Floor((double)ts.Days / 30));
return months <= 1 ? "one month ago" : months + " months ago";
}
else
{
int years = Convert.ToInt32(Math.Floor((double)ts.Days / 365));
return years <= 1 ? "one year ago" : years + " years ago";
}
}
我应该遇到的唯一问题是来自var ts = new TimeSpan(DateTime.UtcNow.Ticks - yourDate.Ticks);
尽管我阅读了堆栈溢出查找TimeSpan
和Ticks
等价物的两个问题,但我仍然对如何正确转换代码行有一些想法。另外,我必须得到一个{
那么我怎样才能正确地转换它呢
var ts = new TimeSpan(DateTime.UtcNow.Ticks - yourDate.Ticks);
double delta = Math.Abs(ts.TotalSeconds);
# 1 楼答案
你需要更深入地了解这种方法的实际作用。从字面上来说,将代码从C#翻译成Java并不能给你提供一个好的解决方案,而且会让你陷入特定于语言的细节
这两行基本上计算了
timestamp
到当前时间的(绝对)秒差。这可以用Java编写,如下所示:我只是在回答你关于如何转换这两条线的实际问题。提供的代码段不是有效的Java代码,缺少某些部分
delta
是以秒为单位的差,不一定是双精度的。传递给方法的参数应命名为now
以外的任何名称,因为这是要与方法内的当前时间进行比较的时间戳# 2 楼答案
您可以使用SimpleDataFormat创建一个好的显示格式(使用类似
"HH hours, mm minutes and ss seconds ago"
的格式(不确定这个确切的示例是否有效))。您还可以使用Instant获取当前时间,也可以使用Instant.now().minusSeconds(Instant.now().minusSeconds(seconds).getEpochSeconds())
表示时差(或者只使用System.currentTimeMillis()并乘以1000)或者,您可以使用Duration并使用getSeconds()和getHours()等编写自定义显示格式