一个简单的代码:
protected void Page_Load(object sender, EventArgs e)
{
DateTime now = DateTime.UtcNow;
lit.Text += "<br/>now.DayOfWeek: " + now.DayOfWeek.ToString();
// weekdays (Saturday is not included)
DayOfWeek runningDays = DayOfWeek.Monday | DayOfWeek.Tuesday | DayOfWeek.Wednesday | DayOfWeek.Thursday | DayOfWeek.Friday;
lit.Text += "<br/>" + runningDays.HasFlag(now.DayOfWeek);
lit.Text += "<br/>" + runningDays.HasAny(now.DayOfWeek);
lit.Text += "<br/>" + ((runningDays & now.DayOfWeek) != 0);
// weekend (Saturday is in a weekend)
runningDays = DayOfWeek.Saturday | DayOfWeek.Sunday;
lit.Text += "<br/>" + runningDays.HasFlag(now.DayOfWeek);
lit.Text += "<br/>" + runningDays.HasAny(now.DayOfWeek);
lit.Text += "<br/>" + ((runningDays & now.DayOfWeek) != 0);
}
帮手:
public static bool HasExactly(this DayOfWeek x, DayOfWeek y) { return x == y; }
public static bool HasAny(this DayOfWeek x, DayOfWeek y) { return 0 != (x & y); }
public static bool HasAll(this DayOfWeek x, DayOfWeek y) { return y == (x & y); }
今天的输出(星期六)
now.DayOfWeek: Saturday
True
True
True
True
True
True
但输出应该是:
now.DayOfWeek: Saturday
False
False
False
True
True
True
我在这里缺少什么?
答案 0 :(得分:12)
星期几不是位标志。 http://msdn.microsoft.com/en-us/library/system.datetime.dayofweek.aspx
中的常量值 DayOfWeek枚举范围从 DayOfWeek.Sunday to DayOfWeek.Saturday。如果演员阵容 整数,其值范围为零 (表示DayOfWeek.Sunday)来 六(表示 DayOfWeek.Saturday)。
答案 1 :(得分:7)
我知道这是一篇旧文章,但以防万一 - 做标志枚举的简洁语法是
[Flags]
public enum DaysOfWeek
{
None = 1 << 0,
Monday = 1 << 1,
Tuesday = 1 << 2,
Wednesday = 1 << 3,
Thursday = 1 << 4,
Friday = 1 << 5,
Saturday = 1 << 6,
Sunday = 1 << 7
}
您需要无以指示未选择任何内容。这样的枚举允许您指示多天,例如:
var selectedDays = DaysOfWeek.Tuesday | DaysOfWeek.Friday;
希望不需要评论。并且为了“解码”价值:
public bool IsDayOfWeekSelected(DaysOfWeek which, DaysOfWeek selection)
{
return selection & which == which;
}
然后我们可以致电:
var isTuesday = IsDayOfWeekSelected(DaysOfWeek.Tuesday, selectedDays); // => true
var isWednesday = IsDayOfWeekSelected(DaysOfWeek.Wednesday, selectedDays); // => false
var isFriday = IsDayOfWeekSelected(DaysOfWeek.Friday, selectedDays); // => true
希望这有助于某人。
答案 2 :(得分:2)
如果您需要像旗帜一样使用它,您可以创建自己的DayOfWeek枚举:
[Flags]
public enum MyDayOfWeek { Sunday = 1, Monday = 2, Tuesday = 4, ... , Saturday = 64 };
答案 3 :(得分:1)
DayOfWeek有序号。
使用List<DayOfWeek>
。
转到定义显示:
// Summary:
// Specifies the day of the week.
[Serializable]
[ComVisible(true)]
public enum DayOfWeek
{
// Summary:
// Indicates Sunday.
Sunday = 0,
//
// Summary:
// Indicates Monday.
Monday = 1,
//
// Summary:
// Indicates Tuesday.
Tuesday = 2,
//
// Summary:
// Indicates Wednesday.
Wednesday = 3,
//
// Summary:
// Indicates Thursday.
Thursday = 4,
//
// Summary:
// Indicates Friday.
Friday = 5,
//
// Summary:
// Indicates Saturday.
Saturday = 6,
}
答案 4 :(得分:0)
DayOfWeek
枚举旨在代表一周中的一天,而不是一组天。
使用&
时不会出现编译错误,因为枚举是整数,但运算符没有达到预期效果(除非您恰好只在星期一,星期二或星期四安排事件)。
如果你想要一个比特标志,那么就像Ray建议的那样声明一个比特标志类型。