|
Try the DateDiff function.
Private Function getNumberOfWeeks(ByVal year As Integer) As Long
Dim d1 As Date = New Date(year, 1, 1)
Dim d2 As Date = New Date(Year, 12, 31)
Return DateDiff("w", d1, d2, FirstDayOfWeek.Monday)
End Function
Volker Weichert
|
|
|
|
|
you'r function seems to always return 52 weeks nomatter what year I give in (tryed it with year 2008 - 2017)
normally 2010 or 2009 should return 53
If my help was helpfull let me know, if not let me know why.
The only way we learn is by making mistakes.
|
|
|
|
|
You can add another parameter to the DateDiff function that specifies when the first week of the year starts. Perhaps that can help. Other than that I can only think of getting the number of days between the first Monday of the year and the 31st December, divide it by 7 and round to the next higher integer. Then add another week depending on the number of days before the first Monday.
Private Function getNumberOfWeeks(ByVal year As Integer) As Integer
Dim daysBeforeFirstMonday As Integer = 8 - New Date(year, 1, 1).DayOfWeek()
If daysBeforeFirstMonday > 6 Then daysBeforeFirstMonday -= 7
Dim firstMonday As Date = New Date(year, 1, daysBeforeFirstMonday + 1)
Dim firstDayOfNewYear As Date = New Date(year + 1, 1, 1)
Dim weeks As Integer = Math.Floor(firstDayOfNewYear.Subtract(firstMonday).Days / 7)
If daysBeforeFirstMonday > 0 Then weeks += 1
Return weeks
End Function
The last part of the function has to be adjusted to your idea of the first week of the year.
Volker Weichert
|
|
|
|
|
Are you on about VB6 or VB.Net?
If it's VB.Net then this will work:
(sorry the code is in C# ... it should be easy to convert)
DateTime startOfYear = new DateTime(2008, 1, 1);
DateTime endOfYear = new DateTime(2008, 12, 31);
TimeSpan yearLength = endOfYear - startOfYear;
double numberOfWeeks = (yearLength.TotalDays / 7);
Console.WriteLine("Numbers of weeks: {0}", numberOfWeeks);
Console.ReadLine();
|
|
|
|
|
I am indeed talking about vb.net (I know how to do it in vba (vb6 probably is the same)) but it doesn't work anymore in vb.net
converting c# is no problem (I know it almost as good as vb.net)
you'r function seems to always return 52 weeks nomatter what year I give in (tryed it with year 2008 - 2017)
normally 2010 or 2009 should return 53
observation:
a year always has 364 or 365 days
364/7 = 52
365/7 = 52,142847142847142847...
so always 52
you might have misunderstood what I need
let me explain a bit more
in the world there are 3 kind of weeksystems
- week 1 is where 1/1/YYYY fals into
- week 1 is the first week of the year that has 4 full days in the new year
- week 1 is the first full week of the new year
and then there is also the posibility that the week starts at a different day
usually its monday but on occasion its sunday (or in extreem cases any other day)
so I need a function that takes this into account and looks if 31/12/YYYY is week 53 or 52
say 1/1/2008 is a thuesday (as it is now) then 2007 has 52 weeks (if start of week = monday or sunday)
say 1/1/2008 is a thursday (as 3/1/2008 is now) then 2007 has 52 weeks if start of week = monday but has 53 weeks if start of week = sunday
hope this helps a bit to explain what I'm trying to do
If my help was helpfull let me know, if not let me know why.
The only way we learn is by making mistakes.
|
|
|
|
|
Ahhhh yeah I get you now.
You need to check out the stuff in System.Globalisation[^].
Here's a little example code on the usage, again forgive my C#
System.Globalization.GregorianCalendar gregorianCalendar = new System.Globalization.GregorianCalendar();
for (int i = 2000; i < 2020; i++)
{
DateTime endOfYear = new DateTime(i, 12, 31);
int numberOfWeeks = gregorianCalendar.GetWeekOfYear(endOfYear, System.Globalization.CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
Console.WriteLine("Year: {0} Number of Weeks: {1}", i, numberOfWeeks);
}
Console.ReadLine();
|
|
|
|
|
thank you this is helping alot
1 small remark it isn't always correct (I think, just had a quick glance at it)
for instance
gregorianCalendar.GetWeekOfYear(endofyear, System.Globalization.CalendarWeekRule.FirstDay, DayOfWeek.Monday)
will return 54 weeks for year 2012 (wich I think isn't right)
but it has sparked an idea on how I could do this
if it works I'll let you know
thanks again
If my help was helpfull let me know, if not let me know why.
The only way we learn is by making mistakes.
|
|
|
|
|
I'd be very supprised if it didn't work correctly, although a bug in the framework is always possible, are you sure you have it setup correctly?
|
|
|
|
|
I can't be entirly sure that I did it correctly haven't had the time to thurly read the documentation you send me (will do that this weekend) but for as far as my understanding goes at the moment I think I did
I'll let you know what I find
If my help was helpfull let me know, if not let me know why.
The only way we learn is by making mistakes.
|
|
|
|
|
Ok, well good luck
|
|
|
|
|
365 days, and 366 in leap years.
|
|
|
|
|
yeah sorry my mistake still it will not work since the number of weeks has nothing to do with wether or not it's a leap year but with what system one uses to detirmn the first week of the year (as explained above)
still trying to find a way to do this turned out the gregorian calander way helps but still needs some more coding
ah well I'll get there eventually
If my help was helpfull let me know, if not let me know why.
The only way we learn is by making mistakes.
|
|
|
|
|
my hint was 365 and 366, not your 364 and 365 day ...
<br />
Private Function Weeknumber_Entire4DayWeekRule(ByVal inDate As DateTime) As Integer<br />
Const JAN As Integer = 1<br />
Const DEC As Integer = 12<br />
Const LASTDAYOFDEC As Integer = 31<br />
Const FIRSTDAYOFJAN As Integer = 1<br />
Const THURSDAY As Integer = 4<br />
Dim ThursdayFlag As Boolean = False<br />
<br />
' Get the day number since the beginning of the year<br />
Dim DayOfYear As Integer = inDate.DayOfYear<br />
<br />
' Get the numeric weekday of the first day of the<br />
' year (using sunday as FirstDay)<br />
Dim StartWeekDayOfYear As Integer = _<br />
DirectCast(New DateTime(inDate.Year, JAN, FIRSTDAYOFJAN).DayOfWeek, Integer)<br />
Dim EndWeekDayOfYear As Integer = _<br />
DirectCast(New DateTime(inDate.Year, DEC, LASTDAYOFDEC).DayOfWeek, Integer)<br />
<br />
' Compensate for the fact that we are using monday<br />
' as the first day of the week<br />
If StartWeekDayOfYear = 0 Then<br />
StartWeekDayOfYear = 7<br />
End If<br />
If EndWeekDayOfYear = 0 Then<br />
EndWeekDayOfYear = 7<br />
End If<br />
<br />
' Calculate the number of days in the first and last week<br />
Dim DaysInFirstWeek As Integer = 8 - StartWeekDayOfYear<br />
Dim DaysInLastWeek As Integer = 8 - EndWeekDayOfYear<br />
<br />
' If the year either starts or ends on a thursday it will have a 53rd week<br />
If StartWeekDayOfYear = THURSDAY OrElse EndWeekDayOfYear = THURSDAY Then<br />
ThursdayFlag = True<br />
End If<br />
<br />
' We begin by calculating the number of FULL weeks between the start of the year and<br />
' our date. The number is rounded up, so the smallest possible value is 0.<br />
Dim FullWeeks As Integer = _<br />
CType(Math.Ceiling((DayOfYear - DaysInFirstWeek) / 7), Integer)<br />
<br />
Dim WeekNumber As Integer = FullWeeks<br />
<br />
' If the first week of the year has at least four days, then the actual week number for our date<br />
' can be incremented by one.<br />
If DaysInFirstWeek >= THURSDAY Then<br />
WeekNumber = WeekNumber + 1<br />
End If<br />
<br />
' If week number is larger than week 52 (and the year doesn't either start or end on a thursday)<br />
' then the correct week number is 1.<br />
If WeekNumber > 52 AndAlso Not ThursdayFlag Then<br />
WeekNumber = 1<br />
End If<br />
<br />
'If week number is still 0, it means that we are trying to evaluate the week number for a<br />
'week that belongs in the previous year (since that week has 3 days or less in our date's year).<br />
'We therefore make a recursive call using the last day of the previous year.<br />
If WeekNumber = 0 Then<br />
WeekNumber = Weeknumber_Entire4DayWeekRule( _<br />
New DateTime(inDate.Year - 1, DEC, LASTDAYOFDEC))<br />
End If<br />
Return WeekNumber<br />
End Function
i found this with google: "week number vb.net"
|
|
|
|
|
You are only going to have 52 weeks, plus one (or two, if leap year) additional day(s)... so what you will need to know is what day the additional day(s) is/are, which should be easy to find if you know what day 1 Jan of that year is.
Or have I totally misunderstood what you want?
|
|
|
|
|
yes this would be true if there was only 1 way the weeknumbers are calculated in the world but as it stands there are 3 major ways and these then have different ways that need to be calculated still
let me explain a bit more
in the world there are 3 kind of weeksystems
- week 1 is where 1/1/YYYY fals into
- week 1 is the first week of the year that has 4 full days in the new year
- week 1 is the first full week of the new year
and then there is also the posibility that the week starts at a different day
usually its monday but on occasion its sunday (or in extreem cases any other day)
say 1/1/2008 is a thuesday (as it is now) then 2007 has 52 weeks (if start of week = monday or sunday)
say 1/1/2008 is a thursday (as 3/1/2008 is now) then 2007 has 52 weeks if start of week = monday but has 53 weeks if start of week = sunday
If my help was helpfull let me know, if not let me know why.
The only way we learn is by making mistakes.
|
|
|
|
|
I believe all of the above can be achieved if you know the day that 1 Jan falls on...
I am not aware of any direct function call, however - you will need to write it on your own, maybe with switch statements.
|
|
|
|
|
ChandraRam wrote: I am not aware of any direct function call
I was afraid of that
thanks anyway
when I'v written it I'll post it here or as an article since I think this is something many other people might encounter
If my help was helpfull let me know, if not let me know why.
The only way we learn is by making mistakes.
|
|
|
|
|
Hi all,
I am using the following API call to get the Icons and Type of windows file in my application.
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)> _
Private Structure SHFILEINFO
Public hIcon As IntPtr
Public iIcon As Integer
Public dwAttributes As Int32
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=260)> _
Public szDisplayName As String
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=80)> _
Public szTypeName As String
End Structure
Private Declare Auto Function SHGetFileInfo Lib "shell32.dll" _
(ByVal pszPath As String, _
ByVal dwFileAttributes As Integer, _
ByRef psfi As SHFILEINFO, _
ByVal cbFileInfo As Integer, _
ByVal uFlags As Integer) As IntPtr
To get the FIle Type from the above function i needed to include this line:
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)> _
in the strcuture declaration.
This works good in my machine, and returns me the icon and FIle Type. But when i take this code to a different machine, it gives me a build error:
'Charset' is not accessible in this context because it is private.
Can anyone help me figure out as what can be the cause of the problem, as its creating a problem in my developement environment where i use Source Safe to merge everyones work.
Thanks ,
Hemesh
|
|
|
|
|
I don't have any idea why it's throwing that exception, but you don't even need your CharSet value. In VB.NET, CharSet is Auto by default. In C#, it's Ansi.
There are really only two settings anyway. Under Windows 9x and Me, the Auto setting will pick Ansi. Under everything else, Auto picks Unicode.
Though, you still need the Sequential LayoutKind...
|
|
|
|
|
Thanks Dave,
You are right. Its an optional Param. I dont ned to mention the value to be Auto. But if i dont do it, i will not be able to get back the Type of File from the Function. It returns a Blank String. I specifically have to mention the charset for that.
Please refere to the following article for reference:
http://www.thescripts.com/forum/thread365827.html
|
|
|
|
|
Hi
I use Access database in my vb.net project. when I run program in debug mode I get correct display of date time value in a table of a table adapter I use.
The form of displayed value is supposed to be short date ( ex. 4.1.2008 ). but when I run the program as an independent program then the value is diplayed with time like 4.1.2008 10:35.
Does anyone know how to resolve this problem.
Bye
|
|
|
|
|
I found the error but thanks anyway.
|
|
|
|
|
Hi Borec,
How do you solve this issue? I'm also facing something similar. Don't mind to tell us how you solve it?
thanks.
telly
|
|
|
|
|
kindly give the soluton you found.
thanks,
Madhav
|
|
|
|
|
Never mind... i found the problem... it was a security issue
"Many of life's failures are people who did not realize how close they were to success when they gave up." Thomas A. Edison
modified on Friday, January 04, 2008 4:59:06 AM
|
|
|
|