学校开学了, 给一个开学日期(第一周开始),求本周是第几周的算法

gzcsyzzzx 2010-02-06 11:59:28
学校有春季学期,秋季学期
每学期开始为第一周
我想知道当天所在周是此学期的第几周?
要知道如秋季学期,从9月1日起到次年的元月20日左右,应该共有22个周左右

现在,知道了开学日期(9月1日),如何求出当天所在周是本学期的第几周?

这个问题我一直没有好的答案,谁有好的答案?
...全文
3870 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
gzcsyzzzx 2010-02-27
  • 打赏
  • 举报
回复
结贴了,
buding79

(赵云)

回答得不错.
buding79 2010-02-21
  • 打赏
  • 举报
回复
//希望对你有帮助
function TForm1.getStartWeek(begintime, endtime: tdatetime): integer;
var
AValue:integer;
keyTime:tdatetime;
begin
result:=0;

avalue:=DayOfTheWeek(begintime);//开学时间是周几
//开学日期所在周的周一日期
case avalue of
1:keytime:=begintime;
2:keytime:=begintime-1;
3:keytime:=begintime-2;
4:keytime:=begintime-3;
5:keytime:=begintime-4;
6:keytime:=begintime-5;
7:keytime:=begintime-6;
end;

result:=((trunc(endtime)-trunc(keytime)) div 7)+1;
end;
池龙 2010-02-18
  • 打赏
  • 举报
回复
引用 3 楼 gzcsyzzzx 的回复:
引用 1 楼 zhuang_bx 的回复:
第几周=((当前日期-开学日期) div 7 )+1;



这个不好,如果星期五和下周一相比, 只相差三天, 实际应该是不同的两个周,但是你这个。。。。


唔。。。如果是这样的话。可以试试看这个办法。

1. 判断是否为同一年。

2. 如果是同一年,用DateUtils里的函数WeekOfTheYear,分别取得两个日期(开学日期、当天)的所在周,相减,加1,即可。

3. 如果不是同一年,则先用DateUtils里的函数WeeksInAYear,取得开学日期所在周数,和开学当年总计周数,相减得到该学期在开学当年的周数,再加上当天在本年的周数。

大致是:
var
FromYear, FromMonth, FromDay,
ToYear, ToMonth, ToDay : word;
Week1, Week2, WeekInFromYear, WeeksBetween: integer;
begin
DecodeDate(FromDate, FromYear, FromMonth, FromDay);
DecodeDate(Now, ToYear, ToMonth, ToDay);
Week1 := WeekOfTheYear(FromDate);
Week2 := WeekOfTheYear(Now);

if FromYear = ToYear then
begin
WeeksBetween := Week2 - Week1 + 1;
end else
begin
WeekInFromYear := WeeksInAYear(FromDate);
WeeksBetween := (WeekInFromYear - Week1 + 1) + Week2;
end;
end;


没编译过,试试看吧。这是跨一年的,如果要跨多年(学期一般不会吧),作循环即可。
池龙 2010-02-18
  • 打赏
  • 举报
回复
1. 先用DateUtils单元中的DaysBetween函数求得当前日期和开学日期之间的天数。

function DaysBetween(const ANow: TDateTime; const AThen: TDateTime): Integer;

2. 用 天数 div 7 得到周数,如果 天数 mod 7 > 0 (不能整除),则周数加1

大致是:

Days := DaysBetween(Now, DateFrom); //DateFrom是开学日期
Weeks := Days div 7;
if Days mod 7 > 0 then
Inc(Weeks);
yktd26 2010-02-17
  • 打赏
  • 举报
回复
引用 3 楼 gzcsyzzzx 的回复:
引用 1 楼 zhuang_bx 的回复:
第几周=((当前日期-开学日期) div 7 )+1;



这个不好,如果星期五和下周一相比, 只相差三天, 实际应该是不同的两个周,但是你这个。。。。

之后加上一个条件判断是周几不行么???

procedure TForm1.Button2Click(Sender: TObject);
var
Today,Reference:TDate;
ReferenceWeek, thisWeek, weekBetween:integer;
begin
Today := StrToDate(Edit2.Text);
Reference := StrToDate('02/05/2010');
weekBetween := Round(Today - Reference) div 7 +1;
if DayOfTheWeek(Reference)>DayOfTheWeek(Today) then weekBetween := weekBetween + 1;
Edit1.Text := IntToStr(weekBetween);
end;
gzcsyzzzx 2010-02-16
  • 打赏
  • 举报
回复
年份不同, 算法不同
gzcsyzzzx 2010-02-16
  • 打赏
  • 举报
回复
开学日期是2009年9月1日
当前日期是2010年1月2日

年份不同了
sparklerl 2010-02-07
  • 打赏
  • 举报
回复
开学日期是此年中的第几周

当前日期是此年中的第几周

这两个时间计算计算不就出来了吧
zhuang_bx 2010-02-06
  • 打赏
  • 举报
回复
第几周=((当前日期-开学日期) div 7 )+1;
DelisPhi 2010-02-06
  • 打赏
  • 举报
回复
第一步:算出9月1日那周的周日是几年几月几日(注:每周的第一天是周日来的)比如获取9月1日星期几,就往前推“几”天(可能有点乱,周日算0,周一计1,以此类推)
然后:第几周=((当前日期-第一步的“几年几月几日”) div 7 )+1就行了
nongen 2010-02-06
  • 打赏
  • 举报
回复
9月1号所在周,当前日期所在周weekoftheyear
9月1号当前周的第几天。当日在当周的第几天。
buding79 2010-02-06
  • 打赏
  • 举报
回复
Unit DateUtils
function DayOfTheWeek(const AValue: TDateTime): Word; 描述:对于给定的TDateTime类型的日期时间,使用 DayOfTheWeek 函数能得到该日期是该星期的第几天。DayOfTheWeek 函数的返回数值为 1 到 7,其中 1 表示星期一,而 7 表示星期日。注意:DayOfTheWeek 是 ISO 8601 标准的(此标准为星期一是一周的第一天)。
buding79 2010-02-06
  • 打赏
  • 举报
回复
我觉得你可以通过开学时间算出那周的星期一的时间。。。。
这样,就可以用一楼的方法,来解决问题了。。。。。。。
而且这样就可以做到,周间隔都是7天了。
就容易计算了。。。

gzcsyzzzx 2010-02-06
  • 打赏
  • 举报
回复
use DateUtils 好像没有恰当的函数
gzcsyzzzx 2010-02-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dd_zhouqian 的回复:]
use DateUtils

WeekOfTheYear这个?
[/Quote]
WeekOfTheYear 是一年中的向几周, 而学校的周次是跨年, 如元月1日,不是第一周,因为秋季学期还没结束
gzcsyzzzx 2010-02-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zhuang_bx 的回复:]
第几周=((当前日期-开学日期) div 7 )+1;

[/Quote]

这个不好,如果星期五和下周一相比, 只相差三天, 实际应该是不同的两个周,但是你这个。。。。
dd_zhouqian 2010-02-06
  • 打赏
  • 举报
回复
use DateUtils

WeekOfTheYear这个?

16,746

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧