Round to quarter hour; aspx.vb - asp.net

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

Related

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

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

ASP Classic - Find last weeks Friday or any day using days as numbers (1-7, 1=Monday and so on..)

I would like to find last weeks Friday for example.
Using days as numbers (1 through 7) for example:
1= Monday and so on..
It would be something like this but I'm stuck at the GetLastWeek, Please see below, THANKS.
<%
dim weeknum
weeknum=5
dim GetLastWeek
GetLastWeek=???? <== FIND LAST WEEKS FRIDAY AS A DATE Eg: MM/DD/YYYY
%>
Example: Last weeks Friday was on: <%=GetLastWeek%>
I probably start by working out what is the current day of the week and working back from there, you can use something like this;
Dim today, offsetdays, lastfri
'WeekDay() returns 1 - 7 (Sunday - Saturday).
today = WeekDay(Date())
'Workout the offset then use DateAdd() to minus that number of days.
Select Case today
Case 1 'Sunday
offsetdays = 2
Case 2 'Monday
offsetdays = 3
Case 3 'Tuesday
offsetdays = 4
Case 4 'Wednesday
offsetdays = 5
Case 5 'Thursday
offsetdays = 6
Case 6 'Friday
offsetdays = 7
Case 7 'Saturday
offsetdays = 1
End Select
lastfri = DateAdd("d", -offsetdays, Date())
Bear in mind this is pseudo coded (untested) and could probably be made better by storing the offsets in an array and using that to power the DateAdd() instead.
You can use the Weekday() function to find what day of the week any particular date is. With this you should be able to calculate anything else you like. There is a full reference for the function here:
http://www.w3schools.com/vbscript/func_weekday.asp

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

Comparing system time to field value using VB

I need some assistance with writting a VB function to compare the system time with my column 1 datetime variables, and return a different color background. Here is the condition...
if scheduledTime is 0-15mins late, then background row color red
if scheduledTime is 15mins-30mins late, then background row color yellow
if scheduledTime is 30mins-2hours late, then background row color green
Row Rendered event:
Row_Rendered();
DateTime systemTime = DateTime.Now();
DateTime fieldTime = SCHD_DTM.CurrentValue;
DateTime result As Integer = DateTime.Compare(fieldTime,systemTime).TotalMinutes
if result <= 0.25 Then
RowATTrs("style") = "background-color:Red";
else if result > 0.25 & result <- 0.5 Then
RowATTrs("style") = "background-color:Yellow";
else if result > 0.5 & result <= 2 Then
RowATTrs("style") = "background-color:Green";
End If
This is what I had and Im getting no response...
"Im getting no response" is not a good description of an error or undesired behaviour. However, you are mixing C# and VB.NET in your code. Of course that won't compile.
But this should:
Dim systemTime As date = Date.Now
Dim fieldTime As Date = SCHD_DTM.CurrentValue
Dim result As Double= (fieldTime - systemTime).TotalMinutes
If result <= 0.25 Then
RowATTrs("style") = "background-color:Red"
ElseIf result > 0.25 & result < -0.5 Then
RowATTrs("style") = "background-color:Yellow"
ElseIf result > 0.5 & result <= 2 Then
RowATTrs("style") = "background-color:Green"
End If
However, not sure if fieldTime is supposed to be lower than Date.Now. Then swap the variables in (fieldTime - systemTime).
You can use the datediff function to find out what you want,
DateDiff(DateInterval.Minute, systemTime, fieldTime)
will return a long telling you the number of minutes between the two datetimes.

asp.net timespan - 0.5 (half day)

I've been using the following timespan function to work out the number of days between two dates which works correctly.
Dim dtStart As Date = txtHStart_Date.Text
Dim dtEnd As Date = txtHEnd_Date.Text
Dim ts As TimeSpan = dtEnd - dtStart
txtNoofDays.Text = ts.TotalDays.ToString()
Console.WriteLine(ts.TotalDays)
I've now tried to add a check box (as a half day selection). If the check box is selected I want it to minus 0.5 off the total days. But i'm getting the blue line telling me its an error on "ts = (dtEnd - dtStart) - 0.5"
Dim dtStart As Date = txtHStart_Date.Text
Dim dtEnd As Date = txtHEnd_Date.Text
Dim ts As TimeSpan = dtEnd - dtStart
For Each li As ListItem In CheckBoxList1.Items
If li.Value = "Half Day" Then
ts = (dtEnd - dtStart) - 0.5
Else
ts = dtEnd - dtStart
End If
Next
txtNoofDays.Text = ts.TotalDays.ToString()
Console.WriteLine(ts.TotalDays)
Any suggestions on how to correct
ts is your TimeSpan value. You can't subtract 0.5 from a TimeSpan - I know what you want it to mean in this case, but why would "days" be the right unit by default? You can subtract 0.5 days explicitly though:
ts = (dtEnd - dtStart) - TimeSpan.FromDays(0.5)
It's not clear why you're iterating over all the items but only actually using the last item, by the way. If your plan was actually to use the number of days for each item, I'd be tempted to do the subtraction after working out the number of days:
Dim days = (dtEnd - dtStart).TotalDays
If li.Value = "Half Day" Then
days = days - 0.5
End If
' Use days here

Resources