【问题标题】:mistake getting day of week错误获取星期几
【发布时间】:2017-04-11 09:56:59
【问题描述】:

我想从这个函数中获取星期几(星期一,星期二,..),它接收作为参数 3 int 的年份,月份和日期, 我已经尝试过 Calendar 和 GregorianCalendar,但它仍然给我错误,例如,如果我今天通过日期 (2017,11,04),它会给我一周中第 5 天的结果,星期四是今天星期二 我把代码留给你

String diaSemana (int dia, int mes, int ano)
{
    String letraD="";
    /*Calendar c = Calendar.getInstance();
    c.set(ano, mes, dia, 0, 0, 0);
    nD=c.get(Calendar.DAY_OF_WEEK);*/
    TimeZone timezone = TimeZone.getDefault();
    Calendar calendar = new GregorianCalendar(timezone);
    calendar.set(ano, mes, dia);
    int nD=calendar.get(Calendar.DAY_OF_WEEK);
    Log.i("result","diaSemana: "+nD+" dia:"+dia+" mes:"+mes+ "año:" +ano);
    switch (nD){
            case 0: letraD = "D";
                break;
            case 1: letraD = "L";
                break;
            case 2: letraD = "M";
                break;
            case 3: letraD = "X";
                break;
            case 4: letraD = "J";
                break;
            case 5: letraD = "V";
                break;
            case 6: letraD = "S";
                break;
        }

        return letraD;
}

Log.i 显示此消息:

diaSemana:5 dia:11 mes:4 año:2017

【问题讨论】:

    标签: java android calendar dayofweek


    【解决方案1】:

    我知道你标记了你的问题 android,我知道我在我的解决方案中使用的 LocalDate 类还没有内置在 Android 上(它会出现)。要在 Android 上使用它,请获取 ThreeTenABP,请参阅 How to use ThreeTenABP in Android Project。要在 Java 8 或更高版本上使用它,请继续,一切都是内置的。

    static Locale español = Locale.forLanguageTag("es");
    
    static String diaSemana (int dia, int mes, int ano)
    {
        return LocalDate.of(ano, mes, dia)
                .getDayOfWeek()
                .getDisplayName(TextStyle.NARROW, español);
    }
    

    就这么简单吗?让我们用下个月第一周的天数来测试一下:

        for (int dia = 2; dia <= 8; dia++) {
            System.out.format(español, "%-2s%2d%n", diaSemana(dia, 7, 2017), dia);
        }
    

    打印出来

    D  2
    L  3
    M  4
    X  5
    J  6
    V  7
    S  8
    

    尽管星期三是西班牙语的 miércoles,但我相信打印出来的字母完全符合您的要求。

    对于非 Android 程序员,Calendar 类及其子类 GregorianCalendar 早已过时。 2014 年,Java 8 推出了更好、对程序员更友好的替代品。幸运的是,它们也被向后移植到 Java 6 和 7,特别是 Android。对于初学者来说,较新的课程没有关于月份数字的有趣惊喜,您不必关心一周中的天数。

    【讨论】:

      【解决方案2】:

      问题是月份从 0 开始:一月 = 0,二月 = 1 等等。 使用这个:

      calendar.set(ano, mes - 1, dia);
      

      【讨论】:

      • 谢谢,我试过了,但是 Log.i 显示 2017/11/4 的星期三,而今天是星期二
      • 2017/11/4 代表今天吗?在您的代码中,11 是一个月份数。
      【解决方案3】:

      试试这个:

      Calendar calendar = GregorianCalendar.getInstance();
      

      否则日历变量不会被初始化并设置为默认值。这意味着你得到了错误的日期。

      但是,在获得该领域时,您做对了。

      但请注意:星期几从星期日开始。如果您在 DAY_OF_WEEK 上按 CTRL+左键单击,您会看到详细信息。

      /**
       * Field number for <code>get</code> and <code>set</code> indicating the day
       * of the week.  This field takes values <code>SUNDAY</code>,
       * <code>MONDAY</code>, <code>TUESDAY</code>, <code>WEDNESDAY</code>,
       * <code>THURSDAY</code>, <code>FRIDAY</code>, and <code>SATURDAY</code>.
       *
       * @see #SUNDAY
       * @see #MONDAY
       * @see #TUESDAY
       * @see #WEDNESDAY
       * @see #THURSDAY
       * @see #FRIDAY
       * @see #SATURDAY
       */
      

      不过,如果您使用 GregorianCalendar,它可能从星期一开始。但是你要注意的是,第一天不是0,一周的第一天是从1开始的。这是星期天说的:

      /**
       * Value of the {@link #DAY_OF_WEEK} field indicating
       * Sunday.
       */
      public final static int SUNDAY = 1;
      

      星期一是 2,以此类推。

      但是,这可能会因设备设置为一周的第一天而有所不同。添加一些日志标签并在更改获取日历的方式后查看它是什么(请参阅此答案中的第一行代码)

      【讨论】:

      • 它有效,问题是在开关的情况下,我已经将 0 更改为 1,将 1 更改为 2,......并且它可以工作
      猜你喜欢
      • 2016-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-07
      • 2015-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多