【问题标题】:Convert unix time to week day将 unix 时间转换为工作日
【发布时间】:2017-04-28 09:00:41
【问题描述】:

如何将时间从 unix 时间戳转换为工作日?比如我想把1493193408转换成Wednesday

我试过上面的代码,但它总是显示Sunday..

SimpleDateFormat sdf = new SimpleDateFormat("EEEE");
Date dateFormat = new java.util.Date(1493193408);
String weekday = sdf.format(dateFormat );

【问题讨论】:

  • @RobinTopper 已编辑
  • (1) 请注意,工作日取决于时区。在给定的 Unix 时间,在America/Anchorage 时区,它仍然是星期二。 (2) 即使在 Android 上,您也可以丢弃现在非常旧的类 SimpleDateFormatDate 并使用 java.time 中的较新类。这些通常对程序员更友好。见ThreeTenABP
  • 仅供参考,麻烦的旧日期时间类,如 java.util.Datejava.util.Calendarjava.text.SimpleTextFormat 现在是 legacy,被 java.time 类取代。见Tutorial by Oracle

标签: java android datetime


【解决方案1】:

使用 java.time

其他答案使用麻烦的旧日期时间类,现在是遗留的,被 java.time 类取代。

时区对于确定日期至关重要,因此获得星期几。

从 UTC 时间 1970 年以来的 while 秒数中获取 Instant。应用时区以获取 ZonedDateTime。从那里提取一个 DayOfWeek 枚举对象。要求该对象自动本地化以生成其名称的字符串。

Instant.ofEpochSecond( 1_493_193_408L )
        .atZone( ZoneId.of( "America/Montreal" ))
        .getDayOfWeek()
        .getDisplayName( TextStyle.FULL , Locale.US )

对于 Android,请参阅 ThreeTenABP 项目,了解大部分 java.time 功能的反向移植。

【讨论】:

【解决方案2】:

你需要将它乘以 1000,因为 Java 和 Unix 时间不同。

 SimpleDateFormat sdf = new SimpleDateFormat("EEEE");
Date dateFormat = new java.util.Date(1493193408L * 1000);
String weekday = sdf.format(dateFormat );

【讨论】:

  • 如果你想使用过时的Date类你确实需要乘以1000。你还需要考虑int溢出。您的代码错误地产生了星期一。
  • 已修复。日历还需要毫秒或日期对象来设置时间。所以无论哪种方式,他都需要将 unix 纪元时间转换为 java 时间。
【解决方案3】:

您可以使用日历实例,因为它为您提供了获取该信息的方法:

Date date = new Date(1493193408000L);
Calendar c = Calendar.getInstance();
c.setTime(date);

System.out.println(c.get(Calendar.DAY_OF_WEEK));
System.out.println(c.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.US));

【讨论】:

    【解决方案4】:

    Date 构造函数有如下描述:

    分配一个 Date 对象并初始化它以表示指定的 自标准基准时间以来的毫秒数,称为“the 纪元”,即 1970 年 1 月 1 日 00:00:00 GMT。

    你的时间戳以秒为单位,如果你乘以 1000(得到毫秒)你会得到预期的答案:

     SimpleDateFormat sdf = new SimpleDateFormat("EEEE");
     Date dateFormat = new java.util.Date(1493193408000L);
     System.out.println(dateFormat);
     String weekday = sdf.format(dateFormat);
     System.out.println(weekday);
    

    打印出来的

    Wed Apr 26 09:56:48 CEST 2017
    Wednesday
    

    【讨论】:

      【解决方案5】:

      dateFormatStart != dateFormat

      您也可以使用:

      SimpleDateFormat sdf = new SimpleDateFormat("EEEE");
      Date dateFormat = new Date(System.currentTimeMillis());
      String weekday = sdf.format(dateFormat);
      

      【讨论】:

        【解决方案6】:

        这是适合您的代码:

        SimpleDateFormat sdf = new SimpleDateFormat("EEEE");
        Date dateFormat = new java.util.Date(1493193408 * 1000);
        String weekday = sdf.format(dateFormat );
        

        Java date的文档

        【讨论】:

        • 这不是完全正确的代码。我的电脑(丹麦语区域)上的结果是mandag,这是星期一的丹麦语。期望的结果是星期三。你的问题是int溢出:你的乘法结果是-1455211008
        【解决方案7】:

        您可以对新的 JDK 8 日期时间类执行相同的操作。本地日期和时间使用 Unix Epoch 中的秒数计算,然后可以使用特定模式进行格式化。转换为日期时间也考虑了时区,我使用的是默认时区,但可以修改为使用特定时区。

        ZonedDateTime ldt = ZonedDateTime.ofInstant(Instant.ofEpochSecond(1493193408), ZoneId.systemDefault());
        System.out.println(ldt.format(DateTimeFormatter.ofPattern("EEEE")));
        

        【讨论】:

        • LocalDateTime 在这里是错误的类,因为它缺少任何时区概念或与 UTC 的偏移量。因此,您可能无法按照用户的预期获得正确的星期几。 ZonedDateTime 是正确的方法。
        • 感谢@BasilBourque 指出这一点。更新了代码。
        • 啊,ofEpochSecond()。我差点忘了那个。显然在这里使用正确的方法。
        【解决方案8】:

        已经说过:您的问题是您将自 Unix 纪元以来的数字 seconds 输入到 Date,而它期望 milliseconds 的数量(那么人们会预计乘以 1000 很简单,但其他几个答案弄错了那部分)。

        如果您打算在应用程序中使用日期、时间或工作日,我同意建议您考虑 java.time 中较新课程的答案。他们更好地工作。您的代码将更直接地表达您的意图。

        但是,如果您只需要工作日,那么依赖第三方库可能会过大。不过,我仍然建议与老式课程 SimpleDateFormatDateCalendar 保持距离。有第三种选择吗?肯定有!一个简单的oneliner,甚至:

            String weekday = String.format(Locale.ENGLISH, "%tA", 1493193408 * 1000L);
        

        这会根据需要产生Wednesday。不过,您仍然必须注意,结果取决于您计算机的时区设置。

        【讨论】:

          猜你喜欢
          • 2018-09-11
          • 1970-01-01
          • 2014-05-06
          • 2015-02-09
          • 1970-01-01
          • 2020-12-23
          • 2016-04-24
          • 2012-07-04
          相关资源
          最近更新 更多