错误得到一周的一天

时间:2017-04-11 09:56:59

标签: android calendar dayofweek

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

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:4año:2017

谢谢!

3 个答案:

答案 0 :(得分:1)

问题是几个月从0开始:1月= 0,2月= 1等。 使用此:

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

答案 1 :(得分: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)

试试这个:

Calendar calendar = GregorianCalendar.getInstance();

其他日历变量未初始化并设置为默认值。这意味着你的日期错了。

然而,在获得该领域时,你做得对。

请注意:周日开始于星期日。如果按CTRL +左键单击DAY_OF_WEEK,您将看到详细信息。

/**
 * 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,依此类推。

但是,这可能会因设备设置为一周的第一天而有所不同。添加一些logtags并查看更改日历后的内容(请参阅此答案中的第一行代码)