有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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);

尽管我阅读了堆栈溢出查找TimeSpanTicks等价物的两个问题,但我仍然对如何正确转换代码行有一些想法。另外,我必须得到一个{},它需要{}才能得到{},我也找不到一个合适的方法来处理它,但我确实找到了{a2},仍然不知道如何处理它

那么我怎样才能正确地转换它呢

var ts = new TimeSpan(DateTime.UtcNow.Ticks - yourDate.Ticks);
double delta = Math.Abs(ts.TotalSeconds);

共 (2) 个答案

  1. # 1 楼答案

    你需要更深入地了解这种方法的实际作用。从字面上来说,将代码从C#翻译成Java并不能给你提供一个好的解决方案,而且会让你陷入特定于语言的细节

    这两行基本上计算了timestamp到当前时间的(绝对)秒差。这可以用Java编写,如下所示:

    Duration duration = Duration.between(LocalDateTime.now(), timestamp);
    long delta = duration.abs().getSeconds();
    

    我只是在回答你关于如何转换这两条线的实际问题。提供的代码段不是有效的Java代码,缺少某些部分delta是以秒为单位的差,不一定是双精度的。传递给方法的参数应命名为now以外的任何名称,因为这是要与方法内的当前时间进行比较的时间戳

  2. # 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()等编写自定义显示格式