上次去面试:不用函数,计算任何两个日期之间的天数(10分)

W

windstopped

Unregistered / Unconfirmed
GUEST, unregistred user!
楼上说的不错,我们的程序员是浮躁了一些,我们应该踏实的走下去,一步一个脚印!!
 
R

reedblue

Unregistered / Unconfirmed
GUEST, unregistred user!
to muhx:
本来想写一下哩,一看你都写了啦。。。。。
看你的代码觉得你很有水平,有机会聊聊^_^
QQ:390052953
 
M

muhx

Unregistered / Unconfirmed
GUEST, unregistred user!
To reedblue
我的QQ是38778842
共同提高
BTW: 我的水平很烂,特别从杭州来到北京之后,发现自己的水平很烂很烂
努力提高中……
^_^
 
M

MrMengyi

Unregistered / Unconfirmed
GUEST, unregistred user!
muhx,个人的一点看法:
2.上面很多朋友说用相减的方式。是的,在Delphi这个环境中这个说法是正确的,可是如果脱离Delphi环境呢,难道以后遇到问题Delphi提供的功能我们会用,Delphi没有提供的功能我们就不会了吗?这样我们完全被别人控制了。
---
软件系统已经有了现成的,已经测试过的东西,为什么直接使用呢?而且也只有知道Delphi对时间的处理,才知道相减即可。
3.很多人都说自己是程序员,可是我们能称得上是程序员吗?微软使用API屏蔽了硬件细节结果统治了操作系统。表面上难做的事情都是他们做了,事实上我们丧失了了解细节的机会。现在.Net在API基础上再加一层FrameWork封装,也许不久,我们和我们以后的所谓程序员只会在微软定义的框架内做有限的组合拼装。
--
细节还是可以钻研的啊。虽然我也不喜欢MS的FrameWork,但是这个东东还是有非常大的意义。如果想从低层学习起,也可以不使用。
另外,软件的复杂程度达到一定规模后,一定会向着这样的方向发展(如统一平台)。如果是您做系统,到达了一定规模,也会这么想的吧。呵呵。
BTW:
人的学习程序设计的过程是很奇妙的。
开始的时候只敢使用系统提供的函数,
学习到一定阶段后,就开始自己做一些函数实现(通常是因为不知道系统有这样的函数,或者不了解系统提供的函数),
最后完全了解后,就可以根据显示情况,收发自如了。
所以,自己写函数实现,不一定比使用系统提供的函数更高明。
个人意见,谨供参考
 
L

lxggc

Unregistered / Unconfirmed
GUEST, unregistred user!
请大家看清楚题目:
------------------------------
用java c or delphi vb
------------------------------
其中包括 delph
 
F

fengfan

Unregistered / Unconfirmed
GUEST, unregistred user!
看了这个题目,更不敢去面试了,老实点,呆着吧.
 
N

Neo_leaf

Unregistered / Unconfirmed
GUEST, unregistred user!
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int main( void )
{
struct tm tstart,tend;
time_t t_of_startday, t_of_endday, tdiff;
tstart.tm_year=1997-1900;
//start year :1997
tstart.tm_mon=6;
//start month :7
tstart.tm_mday=1;
//start day :1
tstart.tm_hour=0;
tstart.tm_min=0;
tstart.tm_sec=1;
tstart.tm_isdst=0;
t_of_startday=mktime(&tstart);
printf(&quot;Start date is: %s&quot;,ctime(&t_of_startday));
tend.
tm_year=2006-1900;
//end year: 2006
tend.
tm_mon=8;
//end month: 9
tend.
tm_mday=22;
//end day : 22
tend.
tm_hour=0;
tend.
tm_min=0;
tend.
tm_sec=1;
tend.
tm_isdst=0;
t_of_endday=mktime(&tend);
printf(&quot;
end date is: %s&quot;,ctime(&t_of_endday));
tdiff = difftime(t_of_endday,t_of_startday);
printf(&quot;Total diff days is: %ld/n&quot;,tdiff/(3600*24));
return 0;
}
------------
C++ 的代码,
 
D

dingbaosheng

Unregistered / Unconfirmed
GUEST, unregistred user!
题目 EASY
只需要两个函数就搞定了
//-----------------------------
//public function define
//----------------------------
function IsPinYear(year) //判断闰年
{
if ((year%4==0)&&((year%100!=0)||(year%400==0))) { return true;}
else
{ return false;}
}
function getdays(year,month)//根据年月取天数
{
if (month==2){
if(IsPinYear(year))
{ return 29;
}
else
{ return 28;
}
}
if((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12)){
return 31;
}
if ((month==4)||(month==6)||(month==9)||(month==11)){
return 30;
}
}

上面是JavaScript,Delphi一样写...............
 
Q

qqjm

Unregistered / Unconfirmed
GUEST, unregistred user!
to:muhx
你是算出了,但是还有更好的算法:先计算日期的天数,然后相减。
----
一年是365天 那么过了10年就有 365*10 天,因为每4年一闰所以还要加上 10 div 4天,所以
到当2006年新年钟声响起时就有 (2006-1) *365 + (2006-1) div 4 天了。
月份和日的天数应该人人会算的,这我就不说了。

----------------------------------------------
假设已经解析 日期1 和 日期2 得到整数 Y1,M1,D1 和Y2,M2,D2
那么两个日期之间的相差天数为
(((Y2-1)*365+((Y2-1) div 4)) + GetData(Y2,M2)+D2 ) - (((Y1-1)*365+((Y1-1) div 4)) + GetData(Y1,M1)+D1)
Function GetDate( Y,M :integer):integer;
const
DayPerMonth: array[1..12] of Integer = (31, 28, 31, 30, 31, 30, 31, 31,
30, 31, 30, 31);
DayPerMonthEx: array[1..12] of Integer = (31, 29, 31, 30, 31, 30, 31, 31,
30, 31, 30, 31);
var
i:integer;
RunNian:boolean;
begin
Result:=0;

if M > 12 then
Exit;
//检查是否闰年
if (Y div 4) = 0 then
RunNian:=true else
RunNian:=false;
for i :=0 to M-1do
begin
if RunNian then
Result:=Result + DayPerMonthEx
else
Result:=Result + DayPerMonth;
end;

end;
 

雪狐狸

Unregistered / Unconfirmed
GUEST, unregistred user!
面视的人变态...
谁会有精力去钻研这种问题
这人要么是不懂装懂
这么是怀旧的老程序员
 
R

rogue

Unregistered / Unconfirmed
GUEST, unregistred user!
SB,题目不是有说可以用DELPHI嘛
为什么不用减的,
还说用减的就不是程序员
那他妈的按照这个理论,都用机器嘛编程算了
简单,无错的完成任误,就是最好的代码
 
Z

zouhouzi

Unregistered / Unconfirmed
GUEST, unregistred user!
[?]这很难实现难吗? dingbaosheng写的非常漂亮!看着实在舒服~
 

晚起的小虫

Unregistered / Unconfirmed
GUEST, unregistred user!
用Delphi
Result = Round(d1)-Round(d2);
 

太阳河上

Unregistered / Unconfirmed
GUEST, unregistred user!
本人认为:了解需求以最快的速度完成才是正确。正如砍一颗树,有了电锯,为什么非用刀呢?
两日期间的天数,当用什么工具时,就用工具提供的方法,没有时,才自己写。连DELPHI还用了第三方的控件,难道说开发Delphi的工程师们不行吗?
 
E

enterwin

Unregistered / Unconfirmed
GUEST, unregistred user!
根据dingbaosheng算法,DELPHI//public function define
//----------------------------
function IsPinYear(year):boolean;
//判断闰年
begin
if ((year mod 4=0) and ((year mod 100<>0) or (year mod 400= 0))) then
Result := True
else
Result := False;
end;

function getdays(year,month):integer;//根据年月取天数
begin
if month in[1,3,5,7,8,10,12] then

Result := 31
else
Result :=30;
//处理2月得天数
if (month=2) then
if (IsPinYear(year)) then
Result := 29
else
Result := 28;

end;
// 获得自从1970-01-01到目标日期得总天数。
function GetNumDate( const wYear,wMonth,wDay:word):integer;
var
iY,iM:integer;
begin
Result :=0;
//计算年得天数
for iY := 1971 to wYeaydo
for iM := 1 to 12do
Result := Result + getdays(iY,iM);
//计算月得天数
for iM := 2 to wMonthdo

Result := Result + getdays(wYear,iM);

//得天数
Result := Result + wDay-1;
end;
//获取年,月,日
procedure DecodeStrDate(const strDate:string;var wYeay,wMonth,wDay:word)
begin
wYear := strtoint(copy(strDate,1,4));
wMon := strtoint(copy(strDate,5,2));
wDay := strtoint(copy(strDate,7,2));
end;
//获取天数,日期格式为YYYYMMDD,如2006-10-13为20061013。
function GetCompareDate(const FromDate,toDate:string):integer;
var
fYear,fMon,fDay,tYear,tMon,tDay:word;
begin
DecodeStrDate(FromDate,fYeay,fMonth,fDay);
DecodeStrDate(ToDate,tYeay,tMonth,tDay);
//2个自1970-01-01日起得总天数相减,得出这2个日期之间得天数。
Result := GetNumDate( tYear,tMonth,tDay)-GetNumDate( fYear,fMonth,fDay);
end;
 
P

Passion

Unregistered / Unconfirmed
GUEST, unregistred user!
计算出两个某年月日的各自的等效标准日,然后相减即可。
计算等效标准日的函数GetEquStandardDays以及其他几个引用的函数如下。它们来自CnPack组件包的CnCalendar.pas 历法计算单元,有细微修改。下载地址是www.cnpack.org
// 返回某公历是否闰年
function GetIsLeapYear(AYear: Integer): Boolean;
begin
Result := (AYear mod 4 = 0) and ((AYear mod 100 <> 0) or (AYear mod 400 = 0));
end;

// 取本月天数,不考虑 1582 年 10 月的特殊情况
function GetMonthDays(AYear, AMonth: Integer): Integer;
begin
case aMonth of
1,3,5,7,8,10,12:
Result := 31;
4,6,9,11:
Result:= 30;
2:// 闰年
if GetIsLeapYear(AYear) then
Result := 29
else
Result := 28
else
Result := 0;
end;
end;

// 取某日期到年初的天数,不考虑 1582 年 10 月的特殊情况
function GetDayFromYearbegin
(AYear, AMonth, ADay: Integer): Integer;
var
I: Integer;
begin
Result := 0;
for I := 1 to AMonth - 1do
Inc(Result, GetMonthDays(AYear, I));
Inc(Result, ADay);
end;

// 获取Gregorian 历中的等效标准天数,此处不考虑 Julian 历
function GetEquStandardDays(AYear, AMonth, ADay: Integer): Integer;
begin
Result := (AYear - 1) * 365 + ((AYear - 1) div 4) -((AYear - 1) div 100)
+ ((AYear - 1) div 400) + GetDayFromYearbegin
(AYear, AMonth, ADay);
end;
 
S

sefeng1982

Unregistered / Unconfirmed
GUEST, unregistred user!
这个题目非常好。delphi 的问题就是在这里,很多程序员包括我,总是喜欢利用VCL,结果脱离不了VCL。
我现在走的路就是 了解VCL,脱离VCL.
 
M

muhx

Unregistered / Unconfirmed
GUEST, unregistred user!
大家互相讨论一下
不要随便骂人:)
 

雪雕

Unregistered / Unconfirmed
GUEST, unregistred user!
不是面试的人变态,人家考的就是你是否对日期类型真正了解
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
889
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
顶部