2017-04-11 94 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。對於初學者來說,較新的課程對於月份數字沒有有趣的驚喜,並且您無需關心一週中的天數。