【问题标题】:epoch time to Date with current year纪元时间与当前年份的日期
【发布时间】:2012-05-25 05:44:39
【问题描述】:
String mytime = "5177706";

long epoch = Long.parseLong( mytime );

Date expiry = new Date( epoch * 1000 );

当我将纪元时间转换为日期时,结果是

1970 年 3 月 2 日星期一 05:45:06 SGT

由于纪元时间,年份是 1970 年,虽然答案的日期和月份是期望的结果。

如何将年份转换为当前年份作为输出,例如。 2012 年 3 月 2 日星期一 05:45:06 SGT?

【问题讨论】:

  • 您显示的时代是 1970 年。Java 转换是正确的。你的时代已经过时了。当年的纪元以133 开头。

标签: java datetime epoch


【解决方案1】:

基本上你只想这样做:

Calendar cal = Calendar.getInstance();
cal.setTime(expiry);
cal.set(Calendar.YEAR, 2012);
Date expiryThisYear = cal.getTime();

提出了一些有趣的问题,关于您最初是如何将 517706 作为输入的,但世界有时是一个奇怪的地方 :)

【讨论】:

    【解决方案2】:

    您的问题不是很清楚(听起来像是一些奇怪的硬件问题)。无论如何,您只需添加自您提供的日期以来经过的时间(以毫秒为单位)。

    1. msOriginal 是您提供的日期,单位为毫秒。
    2. msElapsed 是自 1970 年以来经过的总毫秒数。这等于 2012 - 1970 = 42 年。
    3. msElapsedLeapYears 是经过的闰年总天数。如果您查看 wiki 文章,List of leap years 您可以看到有 11 年。所以你必须考虑 11 天。

    以上 3 个字段的总和为您提供了您正在寻找的结果。请注意,日期不会在同一天(3 月 1 日不是 2012 年的星期日)。如果您希望这一天保持不变,则必须是 2015 年(45 年)。基本上,mod 7 经过的天数需要为 0 才能使日期落在同一天。

    此示例代码是在 groovy 中完成的,因此语法与常规 java 略有不同。

    long epoch = 5177706l;
    Calendar current = Calendar.getInstance();
    current.setTimeInMillis(epoch*1000);
    println current.getTime();
    long msOriginal = (epoch*1000);
    long msElapsed = 42l*365*24l*3600*1000;
    long msElapsedLeapYears = 11l*24*3600*1000;
    current.setTimeInMillis(msOriginal+msElapsed+msElapsedLeapYears);
    println current.getTime();
    

    结果:

    Sun Mar 01 16:15:06 CST 1970
    Thu Mar 01 16:15:06 CST 2012
    

    【讨论】:

      【解决方案3】:

      以下代码将epoch, 5177706 秒添加到当年的 1 月 1 日,即 2012 年 1 月 1 日 00:00:00:000 GMT。

      public static void main(String[] args) {
          String mytime = "5177706";
          long epoch = Long.parseLong(mytime);
      
          // Get January 1st of the current year in GMT.
          Calendar calendar = Calendar.getInstance();
          calendar.setTimeZone(TimeZone.getTimeZone("GMT"));
          calendar.set(Calendar.MONTH, Calendar.JANUARY);
          calendar.set(Calendar.DAY_OF_MONTH, 1);
          calendar.set(Calendar.HOUR_OF_DAY, 0);
          calendar.set(Calendar.MINUTE, 0);
          calendar.set(Calendar.SECOND, 0);
          calendar.set(Calendar.MILLISECOND, 0);
      
          // Convert epoch to milliseconds and add to January 1st of the current year.
          Date expiry = new Date(calendar.getTime().getTime() + epoch * 1000);
      
          // Output the expiry date in Asia/Singapore (SGT) time.
          DateFormat format = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
          format.setTimeZone(TimeZone.getTimeZone("Asia/Singapore"));
          System.out.println(format.format(expiry));
      }
      

      以上代码输出Thu Mar 01 06:15:06 SGT 2012。月份、日期和时间与预期的 Mar 02 05:45:06 SGT 不同,原因如下:

      • Singapore Standard Time (SGT) 于 1981 年 12 月 31 日从 UTC+07:30 更改为 UTC+08:00,因此时间增加 30 分钟:

        Mar 02 05:45:06 SGT + 30 分钟 = Mar 02 06:15:06 SGT

      • 2012 年是闰年,所以减去一天:

        Mar 02 06:15:06 SGT - 1 天 = Mar 01 06:15:06 SGT

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-03-02
        • 2015-03-27
        • 1970-01-01
        • 2023-03-27
        • 2023-03-20
        • 2014-06-12
        • 1970-01-01
        相关资源
        最近更新 更多