कार्य दिवस के चारों ओर समय लपेटने का सबसे अच्छा तरीका क्या है?

मेरे पास एक ऐसी स्थिति है जहां मैं एक तारीख में घंटे जोड़ना चाहता हूं और कार्य दिवस के चारों ओर नई तारीख लपेटना चाहता हूं। मैंने इस नई तारीख को निर्धारित करने के लिए एक समारोह को झुकाया, लेकिन यह सुनिश्चित करना चाहता हूं कि मैं कुछ भी नहीं भूल रहा हूं।

जोड़े जाने वाले घंटों को "देरी" कहा जाता है। यह आसानी से फ़ंक्शन के लिए पैरामीटर हो सकता है।

कृपया कोई सुझाव पोस्ट करें। [वीबीएनईटी चेतावनी]

Private Function GetDateRequired() As Date
    ''// A decimal representation of the current hour
    Dim hours As Decimal = Decimal.Parse(Date.Now.Hour) + (Decimal.Parse(Date.Now.Minute) / 60.0) 

    Dim delay As Decimal = 3.0           ''// delay in hours
    Dim endOfDay As Decimal = 12.0 + 5.0 ''// end of day, in hours
    Dim startOfDay As Decimal = 8.0      ''// start of day, in hours

    Dim newHour As Integer
    Dim newMinute As Integer

    Dim dateRequired As Date = Now
    Dim delta As Decimal = hours + delay

    ''// Wrap around to the next day, if necessary
    If delta > endOfDay Then
        delta = delta - endOfDay
        dateRequired = dateRequired.AddDays(1)

        newHour = Integer.Parse(Decimal.Truncate(delta))
        newMinute = Integer.Parse(Decimal.Truncate((delta - newHour) * 60))
        newHour = startOfDay + newHour
    Else
        newHour = Integer.Parse(Decimal.Truncate(delta))
        newMinute = Integer.Parse(Decimal.Truncate((delta - newHour) * 60))
    End If

    dateRequired = New Date(dateRequired.Year, dateRequired.Month, dateRequired.Day, newHour, newMinute, 0)

    Return dateRequired
End Sub

Note: This will probably not work if delay is more than 9 hours long. It should never change from 3, through.

संपादित करें: लक्ष्य वर्तमान समय में कई घंटे जोड़ने के परिणामस्वरूप आपको प्राप्त होने वाली तिथि और समय मिल जाता है। इसका उपयोग जमा करने की देय तिथि के लिए डिफ़ॉल्ट मान निर्धारित करने के लिए किया जाता है। मैं देय दिनांक समय प्राप्त करने के लिए वर्तमान समय में 3 घंटे जोड़ना चाहता हूं। हालांकि, मैं उन तारीखों को नहीं चाहता जो वर्तमान दिन 5 बजे से आगे बढ़ें। इसलिए, मैंने घंटों को (आज, 5 बजे तक) और (कल, 8 बजे से) के बीच विभाजित करने की कोशिश की, जैसे कि 3 घंटे से शाम 4 बजे जोड़ना आपको 1 9 बजे देगा, क्योंकि 1 घंटे आज के अंत में जोड़ा जाता है और 2 कल की शुरुआत में घंटे जोड़े गए हैं।

0
ro fr bn

3 उत्तर

आपको शायद प्रत्येक शर्त के लिए कुछ स्वचालित परीक्षण लिखना चाहिए, जिसके बारे में आप सोच सकते हैं, और उसके बाद परीक्षणों को लिखने के बारे में सोचने के लिए बस और अधिक समझना शुरू करें। इस तरह, आप यह सुनिश्चित कर सकते हैं कि यह काम करेगा, और यदि आप और परिवर्तन करते हैं तो काम करना जारी रहेगा। यदि आप परिणाम पसंद करते हैं तो टेस्ट ड्राइव डेवलपमेंट देखें।

0
जोड़ा
यह जवाब नहीं है लेकिन यह एक उथल-पुथल है।
जोड़ा लेखक Giulio Caccin, स्रोत

मैंने कुछ सफलता के साथ निम्नलिखित सूत्र (छद्म कोड) के साथ काम किया है:

now <- number of minutes since the work day started
delay <- number of minutes in the delay
day <- length of a work day in minutes

x <- (now + delay) / day {integer division}
y <- (now + delay) % day {modulo remainder}

return startoftoday + x {in days} + y {in minutes}
0
जोड़ा
मैं इस समस्या में एक मॉड्यूलस ऑपरेशन करने के लिए एक रास्ता तलाश रहा था। सुन्दर सामान।
जोड़ा लेखक EndangeredMassa, स्रोत

ठीक है, इनके बारे में कैसे? दृष्टिकोण के बीच अंतर खुद के लिए बात करनी चाहिए।

इसके अलावा, यह तब तक परीक्षण किया जाता है जब तक मैं इसे फेंक सकता हूं। वारंटी अब तक चलती है ... अब।

आशा करता हूँ की ये काम करेगा!

Module Module1

    Public Function IsInBusinessHours(ByVal d As Date) As Boolean
        Return Not (d.Hour < 8 OrElse d.Hour > 17 OrElse d.DayOfWeek = DayOfWeek.Saturday OrElse d.DayOfWeek = DayOfWeek.Sunday)
    End Function


    Public Function AddInBusinessHours(ByVal fromDate As Date, ByVal hours As Integer) As Date
        Dim work As Date = fromDate.AddHours(hours)
        While Not IsInBusinessHours(work)
            work = work.AddHours(1)
        End While
        Return work
    End Function


    Public Function LoopInBusinessHours(ByVal fromDate As Date, ByVal hours As Integer) As Date
        Dim work As Date = fromDate
        While hours > 0
            While hours > 0 AndAlso IsInBusinessHours(work)
                work = work.AddHours(1)
                hours -= 1
            End While
            While Not IsInBusinessHours(work)
                work = work.AddHours(1)
            End While
        End While
        Return work
    End Function

    Sub Main()
        Dim test As Date = New Date(2008, 8, 8, 15, 0, 0)
        Dim hours As Integer = 5
        Console.WriteLine("Date: " + test.ToString() + ", " + hours.ToString())
        Console.WriteLine("Just skipping: " + AddInBusinessHours(test, hours))
        Console.WriteLine("Looping: " + LoopInBusinessHours(test, hours))
        Console.ReadLine()
    End Sub

End Module
0
जोड़ा