2012-07-15 48 views
17

Tôi có đơn đăng ký cần chạy vào ngày làm việc và trong giờ làm việc.Làm cách nào để kiểm tra xem ngày hiện tại có đang hoạt động vào ngày

Trong cấu hình ứng dụng, tôi đã thiết lập thời gian bắt đầu ở định dạng

Monday-Friday 
9:00AM-5:30PM 

Bây giờ, tôi có một vấn đề làm thế nào để kiểm tra xem ngày hiện tại nằm trong boundare ngày được (cho thời gian rất dễ dàng - phân tích thời gian với DateTime.ParseExact và nhánh đơn giản sẽ làm), nhưng tôi không biết cách phân tích ngày.

Tôi đã thử với:

DayOfWeek day = DateTime.Now.DayOfWeek; 
if (day >= (DayOfWeek)Enum.Parse(typeof(DayOfWeek), sr.start_day) && 
    day <= (DayOfWeek)Enum.Parse(typeof(DayOfWeek), sr.end_day)) 
{ /* OK */ } 

sr.start_daysr.end_day là chuỗi

nhưng vấn đề xảy ra trong thử nghiệm cuối tuần - rõ ràng, trong DayOfWeekenum, Chủ nhật là ngày đầu tiên trong tuần (đề cập đến các nhận xét về MSDN page

Tôi cho rằng tôi có thể thực hiện một số bài thể dục với mã hiện tại, nhưng tôi đang tìm kiếm mã có thể đọc được nhiều nhất ailable.

Sửa Xin lỗi vì sự hiểu lầm - ngày làm việc không phải là từ thứ Hai đến thứ Sáu - chúng được định nghĩa như các chuỗi trong tập tin cấu hình, và họ thậm chí có thể từ thứ Sáu đến thứ Bảy - mà phá vỡ mã ban đầu của tôi.

+2

Chỉ cần thêm 7 vào ngày kết thúc nếu ngày đó ít hơn ngày bắt đầu. Tương tự, thêm 7 đến ngày nếu nó nhỏ hơn ngày bắt đầu. –

+0

@ HansPassant, vâng, công trình này! Nếu bạn có thể, hãy đăng câu trả lời và tôi sẽ chọn nó! –

+3

Hãy tiếp tục và đăng mã bạn đã sử dụng và đánh dấu nó làm câu trả lời. –

Trả lời

10

Từ Hans Passant's xét về câu hỏi ban đầu của tôi:

Chỉ cần thêm 7 đến ngày kết thúc nếu nó ít hơn so với ngày bắt đầu. Tương tự, thêm 7 ngày nếu ngày đó nhỏ hơn ngày bắt đầu.

DayOfWeek day = DateTime.Now.DayOfWeek; 
DayOfWeek start_day = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), sr.start_day); 
DayOfWeek end_day = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), sr.end_day); 

if (end_day < start_day) 
    end_day += 7; 

if (day < start_day) 
    day += 7; 

if (day >= start_day && day <= end_day) 
{ 
    //Action 
} 
+0

+1 điều này giải quyết trường hợp chung. – Hogan

+0

+1. Điều này là khá gây tranh cãi, nếu không một bằng chứng rằng C# là một ngôn ngữ mà được công việc làm. Như. –

+0

điều này không trả lời câu hỏi .... – markthewizard1234

13
if ((day >= DayOfWeek.Monday) && (day <= DayOfWeek.Friday)) 
{ 
    // action 
} 
+1

Tính năng này không hoạt động và tôi nghĩ nó giống với mã ban đầu của tôi. Ví dụ: nếu tôi thiết lập máy tính của mình vào Thứ Bảy và nếu tôi đặt ngày mai là Chủ Nhật. –

+0

Tôi thấy ... vì vậy bạn không muốn biết nếu đó là một ngày làm việc bạn muốn biết nếu nó là giữa hai chuỗi trong các biến sr.start_day và sr.end_day? – Hogan

+0

Có, tôi xin lỗi nếu tôi không rõ ràng trong câu hỏi của tôi. –

-1

Dòng dưới đây sẽ trở lại "Sunday"

string nameOfTheDay = DateTime.Now.ToString("dddd", new System.Globalization.CultureInfo("en-GB")).ToLower(); 

if(nameOfTheDay != "sunday" && nameOfTheDay != "saturday") 
{ 
//Do Stuff 
} 
+0

-1: Trong khi điều này là đúng đối với hầu hết các nước phương Tây, nó sẽ không hoạt động ở nhiều quốc gia. Xem en.wikipedia.org/wiki/Workweek_and_weekend. – joce

-1
public bool IsWeekend(DateTime dateToCheck) 
    { 
     DayOfWeek day = (DayOfWeek) dateToCheck.Day; 
     return ((day == DayOfWeek.Saturday) || (day == DayOfWeek.Sunday)); 
    } 
+1

-1: Trong khi điều này là đúng đối với hầu hết các nước phương Tây, nó sẽ không hoạt động ở nhiều quốc gia. Xem https://en.wikipedia.org/wiki/Workweek_and_weekend. – joce

4

gia hạn cho DateTime

public static bool IsWeekend(this DateTime date) 
    { 
     return new[] {DayOfWeek.Sunday, DayOfWeek.Saturday}.Contains(date.DayOfWeek); 
    } 
+0

bạn trả về một mảng các boolean? – Hogan

+1

@Hogan Mustafa tạo ra một mảng mới của 'DayOfWeek'instances mà anh ta gọi là' Contains() 'mà lần lượt trả về một' bool'. Hoàn toàn hợp pháp. Lưu ý, bạn sẽ cần phải nhập 'System.Linq' để làm việc này. – rumblefx0

0

Đây là một giải pháp thanh lịch cho vấn đề. Đó là một lớp học có thể dễ dàng được nhập vào các dự án khác. Việc mã hóa cho phép lập trình viên tự động gán ngày nào để kiểm tra và chuyển chúng thành một mảng chuỗi cho lớp đó. Dữ liệu có thể đến từ một cơ sở dữ liệu hoặc được mã hóa cứng khi bạn chuyển nó tới một cá thể của lớp này để xử lý. Nó trả về giá trị True nếu bạn không làm việc và Sai nếu bạn đang làm việc ngày hôm đó. Bên dưới lớp tôi đã cung cấp một ví dụ đơn giản về triển khai. Lớp này có các tính năng: Phân bổ động những ngày bạn đã tắt, Trình xử lý lỗi đơn giản bằng cách đặt chuỗi thành chữ thường trước khi so sánh chúng, Dễ dàng tích hợp với cơ sở dữ liệu có lịch làm việc của bạn, nơi ngày nghỉ của bạn có thể không phải lúc nào cũng giống nhau. Dễ dàng tích hợp dưới dạng số ngày được mã hóa cứng.

// The Class To Check If You're Off Work 

class DayOffChecker 
{ 
    public bool CheckDays(List<string> DaysOff) 
    { 
     string CurrentDay = DateTime.Now.DayOfWeek.ToString(); 
     CurrentDay.ToLower(); 
     foreach (string DayCheck in DaysOff) 
     { 
      DayCheck.ToLower(); 
      if (CurrentDay == DayCheck) 
      { 
       return (true); 
      } 
     } 
     return (false); 
    } 
} 

// Example usage code: 

class Program 
{ 
    List<string> DaysOff = List<string>(); 
    DaysOff.Add("Saturday"); // Add some values to our list. 
    DaysOff.Add("Sunday"); 
    DayOffChecker CheckToday = new DayOffChecker(); 
    if(CheckToday.CheckDays(DaysOff)) 
    { 
     Console.WriteLine("You're Off Today!!!"); 
    } 
} 
0

Chúng tôi cũng có thể thực hiện theo cách tiếp cận tương tự để kiểm tra nếu một giờ nhất định là giữa hai giờ. Sau đây là các thuật toán

checkIfFallsInRange(index,start,end) 

bool normalPattern = start <= end ; 

if (normalPattern) 
    return index>=start && index<=end; 
else 
    return index>=start || index <=end; 
0

giải pháp đơn giản của tôi để xác định nếu ngày hiện nay là một ngày làm việc hay không là:

public static bool IsWorkDay(this DateTime dt) 
{ 
    return IsWorkDay(dt, DayOfWeek.Sunday, DayOfWeek.Saturday); 
} 

public static bool IsWorkDay(this DateTime dt, params DayOfWeek[] noneWorkDays) 
{ 
    return !noneWorkDays.Contains(dt.DayOfWeek); 
} 

Nó giả Chủ Nhật/Thứ Bảy là ngày nghỉ việc. Nếu không, người dùng có thể chỉ định ngày không làm việc. Và là một phần mở rộng cho dễ sử dụng.

Lưu ý: Để tránh vòng lặp có thể tạo cờ bit.

-1
DayOfWeek Day = DateTime.Today.DayOfWeek; 
int Time = DateTime.Now.Hour; 
if (Day != DayOfWeek.Saturday && Day != DayOfWeek.Sunday) 
{ 
if (Time >= 8 && Time <= 16) 
{ 
    //It is Weekdays work hours from 8 AM to 4 PM 
{ 
} 
else 
{ 
    // It is Weekend 
} 
+1

Vui lòng xóa liên kết twitter của bạn. Nó không được bảo đảm. Hơn nữa, một số giải thích được bảo hành, câu trả lời chỉ bao gồm một đoạn mã không phải là câu trả lời hay. – Flater

+1

Không thêm liên kết Twitter của bạn trở lại câu trả lời này (hoặc bất kỳ câu trả lời nào khác). – ChrisF

+0

Mặc dù đoạn mã này có thể giải quyết được câu hỏi, [bao gồm cả giải thích] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho người đọc trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn. – Isma

Các vấn đề liên quan