2017-04-11 93 views
0

我想从这个函数接收作为参数3 int,这是一年中的月和日, 一周中的星期几(星期一,星期二,..)我已经尝试过日历和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个直径:11个MES:4 año:2017

谢谢!

回答

1

问题是个开始0:一月= 0,日= 1等 使用此:

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

谢谢'我已经试过了,但Log.i显示2017/11/4星期三,这一天是星期二 – midlab

+0

是2017/11/4代表今天吗?在你的代码中11是一个月数字。 –

0

试试这个:

Calendar calendar = GregorianCalendar.getInstance(); 

Othervise日历变量是不initalized并设置为其默认值。意思是你得到错误的日期。

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

但请注意:星期几从星期日开始。如果按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,依此类推。

但是,这可能会根据设备设置为一周的第一天而变化。添加一些日志标签,看看它是什么后,你改变你如何得到日历(请参阅此答案中的第一行代码)

+0

它的工作原理,问题是在开关的情况下,我已经改变了0为1,为2,...,它炒锅 – midlab

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。对于初学者来说,较新的课程对于月份数字没有有趣的惊喜,并且您无需关心一周中的天数。