Between 2 dates, & detecting todays date (if in between range) - datetime

Trying another attempt at this question:
With the below code, I'm trying to articulate a date range; May 10 - June 8th. I'm outputting a unique thumbnail image per date in this range (coming together as a stylized calendar of sorts); I need to also detect, within this range, today's date. As a .today style class will be appending for today's date. I achieved this previously when the date range was just within one month, 1 - 31 (and that code is under the most recent attempt / which is original code) this same code could not work because now it's not as simple as 1 - 31 and declaring the month name statically, now it's two months and 10 - 31 and then 1 - 8. Also, not my most recent attempt fails so hard the page doesn't even compile and is just white.
<%
Dim d1 As New Date(2015, 5, 10)
Dim d2 As New Date(2015, 6, 8)
Dim DaysBetween As Long = DateDiff(DateInterval.Day, d1, d2)
Dim d3 As Date
For d As Long = 0 To DaysBetween
d3 = d1.AddDays(d)
If d3 < Today() Then
time = "past"
ElseIf d3 = Today Then
time = "today"
Else
time = "future"
End If
Dim suffix As String = Suffixer(d3.Day)
response.write("<section id='day_"& i &"' class='calSquare " & time &"'><article class='dateImage' style='background-image: url(images/Calendar_Thumbnails/Day_"&i&".jpg)'></article></article><article class='dateTitle'> "&i&suffix&"</article></section>")
Next
<!--response.write(products(0))-->
%>
Original functional code; articulating one month.
<%
For i = 1 to 31
dim time
If i < day_part Then
time = "past"
ElseIf i = day_part Then
time = "today"
Else
time = "future"
End If
suffix = Suffixer(i)
response.write("<section id='day_"& i &"' class='calSquare " & time &"'><article class='dateImage' style='background-image: url(images/Calendar_Thumbnails/Day_"&i&".jpg)'></article></article><article class='dateTitle'>May "&i&suffix&"</article></section>")
Next
<!--response.write(products(0))-->
%>

Your first code sample isn't valid VBScript. The language doesn't support constructs like Dim var As type = value, so that's probably why the page isn't displayed.
As for listing the dates within a range while highlighting the current date, you could do something like this:
today = Date
firstDay = DateValue("2015-05-10")
lastDay = DateValue("2015-06-08")
d = firstDay
While d <= lastDay
If d = today Then
response.write "today"
Else
response.write "other day in range"
End If
d = d + 1
Wend

Related

Get days every other weeks using Enumerable.Range

I need to get value using Enumerable.Range in every two weeks. In this code it get the date in every weeks from selected days as i mention below on the code i select every Tuesday and it return all Tuesday in a month but i need every two weeks of the month and i don't know how to do it. Please i need help.
Dim datesThatAreSundays As IEnumerable = Enumerable.Range(start.DayOfYear, [end].Subtract(start).Days + 1).[Select](Function(n) start.AddDays(n - start.DayOfYear)).Where(Function(d) d.DayOfWeek = DayOfWeek.Tuesday)
Why do you need Enumerable.Range?
Public Iterator Function TheDayEveryTwoWeeks(ByVal TheDay As DayOfWeek, ByVal [start] As Date, ByVal [end] As Date) As IEnumerable(Of Date)
Dim closest_day = [start].AddDays((TheDay - [start].DayOfWeek + 7) Mod 7)
Dim steps_at_most = CType(([end] - closest_day).TotalDays, Integer) \ 14 + 1
For i As Integer = 0 To steps_at_most
Dim d As Date = closest_day.AddDays(i * 14)
If d <= [end] Then
Yield d
Else
Exit Function
End If
Next
End Function
Dim datesThatAreTuesdays = TheDayEveryTwoWeeks(DayOfWeek.Tuesday, [start], [end])

Add Days to Date with 'YYYYMMDD' format

In VB6, I am trying to add days to a date which is in the format 'YYYYMMDD'. I can add days like this:
Pull_Date = Need_Date + Val(txtLeadTime.Text)
which works, until the resulting days is greater than the number of days in the month. I tried using DateAdd, but it doesn't accept the YYYYMMDD format - neither does CDate.
You need to convert your date string to a date so you can use the DateAdd function:
Dim Need_Date As String
Dim Pull_Date As Date
Dim tmpDate As Date
Need_Date = "20141113"
tmpDate = CDate(Mid$(Need_Date, 5, 2) & "/" & Right$(Need_Date, 2) & "/" & Left$(Need_Date, 4))
Pull_Date = DateAdd("d", Val(txtLeadTime.Text), tmpDate)
MsgBox Format$(Pull_Date, "yyyymmdd") '// if LeadTime is 25 days, displays 20141208
Please note, parsing your Need_Date by character position can blow up if it's not formatted exactly as expected.
After digging deeper into this old code, I found that a conversion function was already created:
Public Function Date_Format_YYYYMMDD(ByVal sDate As String) As String
If IsDate(sDate) Then
sDate = Format(sDate, "YYYYMMDD")
End If
Date_Format_YYYYMMDD = sDate
End Function
With this function, it's really easy:
Pull_Date = Date_Format_YYYYMMDD(Need_Date) + Val(txtLeadTime.Text)
The only thing I don't understand is why
Pull_Date = Format(Need_Date, "YYYYMMDD") + Val(txtLeadTime.Text)
doesn't work. Seems like it's doing the same thing as the function.

Set last week's Monday as defaul in dropwdown in VB.NET

I have a dropdown which I have to populate with the last 5 Mondays, but I need to set the Monday of the previos week set as default
I have the following code to create a list of the last 5 Mondays
Public Sub GetMondays()
'populate the dateselection with the last 5 mondays to show the week starting
Dim dtMondays As New DataTable()
dtMondays.Columns.Add("Date")
Dim i As Integer = 1
Dim count As Integer
While (count < 5)
Dim Day As DateTime = Today.AddDays(-i)
If Day.DayOfWeek = 1 Then
DateSelection.Items.Add(New ListItem(Format(Day, "dd/MMM/yyyy"), Day))
count = count + 1
End If
i += 1
End While
End Sub
If today is the 26th of May 2014 I would see the 10th of May and the following full list in the dropdown:
19/05/2014 > Displayed
12/05/2014
05/05/2014
28/04/2014
21/04/2014
If today is the 27th of May 2014 I would see the 10th of May and the following full list in the dropdown:
26/05/2014 > Displayed
19/05/2014 > This one should be displayed
12/05/2014
05/05/2014
28/04/2014
What I need is to keep the order as per above, have the previous Monday selected in the dropdown as per above.
Any ideas on how to do this
Thanks
Compare week number for today and the first item in the list
GetMondays()
Dim c As Calendar = DateTimeFormatInfo.CurrentInfo.Calendar
If c.GetWeekOfYear(Today, CalendarWeekRule.FirstDay, DayOfWeek.Monday) _
= c.GetWeekOfYear(DateSelection.Items(0).Text, CalendarWeekRule.FirstDay, DayOfWeek.Monday) Then
DateSelection.SelectedIndex = 1
Else
DateSelection.SelectedIndex = 0
End If
if week number is the same (e.g. "27/05/2014" and "26/05/2014" will have same week number) then change selection to the second item (SelectedIndex = 1)
P.S.
You can also try more efficient code to populate the list. It does not need to enumerate each day in 4 weeks to find Mondays. You only need to find last Monday and then you can use AddDays(-7) to get a week back.
'Dim count As Integer
'While (count < 5)
' Dim Day As DateTime = (Today.AddDays(1)).AddDays(-i)
' If Day.DayOfWeek = 1 Then
' 'DateSelection.Items.Add(New ListItem(Format(Day, "dd/MMM/yyyy"), Day))
' Console.WriteLine(Format(Day, "dd/MMM/yyyy"), Day)
' count = count + 1
' End If
' i += 1
'End While
Dim Day As Date = Today.AddDays(-(Today.DayOfWeek - DayOfWeek.Monday))
For count As Integer = 1 To 4
DateSelection.Items.Add(New ListItem(Format(Day, "dd/MMM/yyyy"), Day))
Day = Day.AddDays(-7)
Next

VBA Excel create hour column (like in a calendar) according to given time resolution

I need to create some sort of a calendar in VBA.
I need to create a column of hours. The time difference between 2 adjacent cells is determined by an integer read from a text file, which represents the time resolution in minutes.
For example - if Res = 60, the hour column should look like this:
12:00
13:00
14:00
...
if Res = 30, the hour column should look like this:
12:00
12:30
13:00
13:30
14:00
....
I've calculated the number of cells according to the given resultion (if Res = 60, nCells = 24, if Res = 30 nCells = 48 and so on). I just don't know how to create the hour column (in VBA code of course).
Thanks,
Li
You could use DateAdd to increment dates: http://www.techonthenet.com/excel/formulas/dateadd.php
Sub createTimeColumn()
intIncr = 60 'minutes to add each cell
intCellCnt = 1440 / intIncr '24h * 60m = 1440 minutes per day
datDate = CDate("01/11/2013 06:00:00") 'start date+time for first cell
For i = 1 To intCellCnt 'loop through n cells
Cells(i, 1) = Format(datDate, "hh:mm") 'write and format result
datDate = DateAdd("n", intIncr, datDate) 'add increment value
Next i
End Sub
Result will look like
You need a simple loop to which you pass the start range, begin & end time and increment. I recommend to strictly work with dates/times; the output range should be formatted as time
Sub CallTest()
FillIt [A1], #12:00:00 PM#, #1:00:00 PM#, #12:10:00 AM#
End Sub
Sub FillIt(RStart As Range, TStart As Date, TEnd As Date, Inc As Date)
Dim Idx As Integer, TLoop
Idx = 1
TLoop = TStart
Do
RStart(Idx, 1) = TLoop
TLoop = TLoop + Inc
Idx = Idx + 1
Loop Until TLoop > TEnd + #12:00:01 AM# ' need to add 1 second to really
' break the loop where we want
End Sub
Don't worry about the somewhat strange looking Inc parameter .... in VBA editor just enter #0:10:0# ... it will automatically expand to a full 24 hrs AM/PM notation.
The 1 second in the Loop Until is added because I found that the loop is left 1 pass too early (it seems that within the loop #16:0:0# < #16:0:0# resolves to True)
Public Sub MakeTime(RangeA As Range, iRes As Long)
Dim dDate As Date
Dim rCell As Range
Dim X As Variant
Set rCell = RangeA
dDate = CDate(RangeA.Value)
Do
dDate = DateAdd("n", iRes, dDate)
Set rCell = rCell.Offset(1, 0)
rCell.Value = dDate
Loop Until DateDiff("h", CDate(RangeA.Value), dDate) >= 24
End Sub
Sub test()
Call MakeTime(Sheet1.Range("A1"), 45)
End Sub
They beat me to it... But since I've already written a routine... Might as well post it :)
Try this in a new workbook
Sub Main()
' ask for column input
Dim myColumn As String
myColumn = InputBox("Please enter the column letter where the hours will be stored")
' Clear the column
Columns(myColumn & ":" & myColumn).ClearContents
' initial hour
Dim firstHour As String
firstHour = InputBox("Please enter the start time in the hh:mm format i.e. 12:00")
' interval
Dim interval As Long
interval = CLng(InputBox("Please enter the interval in minutes"))
' duration
Dim duration As Long
duration = CLng(InputBox("Please enter the duration (hrs)"))
' apply formatting to column
Columns(myColumn & ":" & myColumn).NumberFormat = "hh:mm;#"
' enter the initial time into cell
Range(myColumn & 1) = CDate(firstHour)
' fill in remaining hours / interval
Dim i As Long
For i = 1 To (60 / interval) * duration
Range(myColumn & 1).Offset(i, 0) = DateAdd("n", interval, CDate(Range(myColumn & 1).Offset(i - 1, 0)))
Next i
End Sub

Round to quarter hour; aspx.vb

Working on a website that's a combination of Jquery Mobile and ASP 4. Currently I'm stuck on a form I'm trying to get to do a SQL insert. I'm trying to use code behind in VB to handle my insert...
All that to say: I need my page to convert a minute value into hour&quarter hour format, rounding to nearest quarter hour.
Currently I'm taking two times entered into text boxes (ex. 8:00:00 AM and 9:12:00 AM). If I use a TimeSpan I can calculate the difference between the two values and dump that difference into a variable, for example tElapsed = tSpan.TotalMinutes.ToString would set tElapsed = 72 for the above times. I need to convert this to a 1.0hr, 1.25hr, 1.5hr, etc format and round 3+ minutes to next half hour... and I keep getting stuck.
Synopsis:
Have:
Text Box: Time1 = 8:00:00 AM
Text Box: Time2 = 9:12:00 AM
Dim tDiff As String = DateTime.Parse.(Time2.Text) - DateTime.Parse(Time1.Text)
Dim tElapse As String = tDiff.TotalMinutes.ToString
tElapse will return 72 for the above, now I need to convert 72 (minutes) to 1.25 (hours).
1.25 hours can be any of: 64 minutes - 78 minutes
Any help would be appreciated...
You can use Math.DivRem
int remainder;
int whole = Math.DivRem(tDiff.TotalMinutes, 60, out remainder);
At this point remainder will now be what's left between hours. 0 to 59 minutes. I wasn't clearn on how you wanted exactly to round that, but (double)remainder / 60.00 will give you the decimal place, which you can then add to the whole.
Here is the solution I used, posting it as an answer so the code structure will show up:
Dim tDiff As TimeSpan = DateTime.Parse(textboxEnd.Text) - DateTime.Parse(textboxStart.Text)
Dim mins As Integer = tDiff.TotalMinutes.ToString
Dim remainder As Integer
Dim hrs As String = Math.DivRem(mins, 60, remainder)
Dim qtyorder As String
Select Case remainder
Case 1 To 2
qtyorder = hrs
Case 3 To 18
qtyorder = hrs & ".25"
Case 19 To 28
qtyorder = hrs & ".50"
Case 29 To 48
qtyorder = hrs & ".75"
Case Else
qtyorder = (hrs + 1) & ".00"
End Select
lblResult.Text = qtyorder

Resources