错误获取星期几
mistake getting day of week
我想从这个接收参数 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
问题是月份以 0 开头:一月 = 0,二月 = 1 等等。
使用这个:
calendar.set(ano, mes - 1, dia);
试试这个:
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,以此类推。
但是,这可能会因设备设置为一周的第一天而有所不同。添加一些日志标签并在更改获取日历的方式后查看它是什么(请参阅此答案中的第一行代码)
我知道你标记了你的问题 android 我知道我在我的解决方案中使用的 LocalDate
class 还没有内置在 Android 上(它将会来)。要在 Android 上使用它,请获取 ThreeTenABP,请参阅 。要在 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
class 及其子class GregorianCalendar
早就过时了。他们更好、对程序员更友好的替代品在 2014 年推出 Java 8。幸运的是,他们也被移植到 Java 6 和 7,特别是 Android。对于初学者,较新的 classes 没有关于月份数字的有趣惊喜,您无需关心星期几的编号。
我想从这个接收参数 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
问题是月份以 0 开头:一月 = 0,二月 = 1 等等。 使用这个:
calendar.set(ano, mes - 1, dia);
试试这个:
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,以此类推。
但是,这可能会因设备设置为一周的第一天而有所不同。添加一些日志标签并在更改获取日历的方式后查看它是什么(请参阅此答案中的第一行代码)
我知道你标记了你的问题 android 我知道我在我的解决方案中使用的 LocalDate
class 还没有内置在 Android 上(它将会来)。要在 Android 上使用它,请获取 ThreeTenABP,请参阅
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
class 及其子class GregorianCalendar
早就过时了。他们更好、对程序员更友好的替代品在 2014 年推出 Java 8。幸运的是,他们也被移植到 Java 6 和 7,特别是 Android。对于初学者,较新的 classes 没有关于月份数字的有趣惊喜,您无需关心星期几的编号。