\section{SBCalendar}
\subsection{Responsibility}
I'm a calendar of Japanese borkerage firm.
\subsection{Abstract}
I consider day off of company, country.
\begin{vdm_al}
class SBCalendar is subclass of JapaneseCalendar -- date
values
io = new IO();
calendar = new SBCalendar();
instance variables
public iTodayOnBusiness : [Date] := nil; -- This value express today for test.
public iTodayOnCompanyMap : [map seq of char to Date] := { |-> }; -- a map of companyCode to todayOnBusiness
public timeOfSystem : [Time] := nil; -- This value express now for test.
functions
static public isCorrectContractMonth: seq of char -> bool
isCorrectContractMonth(aContractMonth) ==
calendar.getDateFromString(aContractMonth ^ "01") <> false;
static public getExerciseDate : seq of char -> Date
getExerciseDate(aContractMonth) ==
let firstDayOfContractMonth = calendar.getDateFromString(aContractMonth ^ "01"),
designatedYear = firstDayOfContractMonth.Year(),
designatedMonth =firstDayOfContractMonth.Month() in
calendar.getNthDayOfTheWeek(designatedYear,designatedMonth,2,<Fri>).getPastWeekday()
pre
isCorrectContractMonth(aContractMonth);
\end{vdm_al}
\subsubsection{getContractDate}
信用取引の決済日(期日)を得る。
弁済期限とは、信用建玉に対して当社がお客様に信用を供与する期限をいいます。弁済期限は、現在のところ6ヶ月のみを取扱っています。
弁済期限が6ヶ月であるということは、信用建玉の建日(信用建玉が約定した日)の6ヶ月目応当日が信用期日となり、この日を超えて建玉を保有することは法律で禁じられています。信用期日が休日の場合には、直近の前営業日が信用期日となります。
この日本語仕様だと、以下の問題があります。
\begin{enumerate}
\item 応答日の定義がない。
\item たとえば信用建玉の建日が8月31日だと、応当日は翌年2月31日になってしまうのだが、そのとき2月29日にするのか3月1日にするのかの記述がない。
\item 応当日からfirstDayOfMonthまですべて休日の場合、前月の営業日にしてよいのかどうかの記述がない。
\item 信用取引の決済日(信用期日)と弁済期限が同じものを指しているが、明確な定義がない。
\end{enumerate}
\begin{vdm_al}
static public getContractDate : Date -> Date
getContractDate(aDate) ==
let
mk_(year, month) = calendar.getMonthOf6monthsLater(aDate.Year(), aDate.Month()),
date = aDate.day(),
candidateDate = getCandidateDate(year, month, date)
in
candidateDate.getPastWeekday() --Sometime the result is a date of previous month.
--pre
--aDate.isNotDayOff()
post
let
mk_(year, month) = calendar.getMonthOf6monthsLater(aDate.Year(), aDate.Month()),
date = aDate.day(),
candidateDate = getCandidateDate(year, month, date)
in
RESULT.EQ(candidateDate.getPastWeekday()) and
if isDayoffFromTheBeginingOfMonthToCandidateDate(candidateDate) then
RESULT.Month() = getPreviousMonth(year, month)
else
RESULT.Month() = month;
static public getMonthOf6monthsLater : int * int -> int * int
getMonthOf6monthsLater(year, month) == calendar.getRegularMonth(year, month+6);
static public getCandidateDate : int * int * int -> Date
getCandidateDate(year, month, date) ==
let dateOfEndOfMonth = calendar.getLastDayOfMonth(year, month)
in
if dateOfEndOfMonth.day() < date then
dateOfEndOfMonth
else
calendar.getDateFrom_yyyy_mm_dd(year, month, date);
static public isDayoffFromTheBeginingOfMonthToCandidateDate : Date -> bool
isDayoffFromTheBeginingOfMonthToCandidateDate(candidateDate) ==
forall day in set {1, ..., candidateDate.day()} &
calendar.isSundayOrDayoff(calendar.getDateFrom_yyyy_mm_dd(candidateDate.Year(), candidateDate.Month(), day));
static public getPreviousMonth : int * int -> int
getPreviousMonth(year, month) ==
let mk_(-, previousMonth) = calendar.getRegularMonth(year, month-1)
in
previousMonth;
static public isDateNil: [Date] -> bool
isDateNil(date) == date = nil; --or date = maxDate();
static public systemDate : () -> Date
systemDate() == calendar.today();
operations
public setTheSetOfDayOffs: int ==> () -- get the set of dayoff, but Sundays are not in set
setTheSetOfDayOffs(year) ==
let japaneseCalendar = new JapaneseCalendar(),
japaneseDayoffSet = japaneseCalendar.getSetOfDayOff(year),
TR1のsetOfDayOff = {
japaneseCalendar.getDateFrom_yyyy_mm_dd(year,1,2),
japaneseCalendar.getDateFrom_yyyy_mm_dd(year,1,3),
japaneseCalendar.getDateFrom_yyyy_mm_dd(year,12,29),
japaneseCalendar.getDateFrom_yyyy_mm_dd(year,12,30),
japaneseCalendar.getDateFrom_yyyy_mm_dd(year,12,31)
},
saturdaySet = japaneseCalendar.getDayOfTheWeekInYear(year,<Sat>) in
Year2Holidays := Year2Holidays munion { year |-> japaneseDayoffSet union TR1のsetOfDayOff union saturdaySet}
pre
year >= 2000;
--todayOnBusinessをreadFromFile
public readTodayOnBusiness : seq of char ==> [Date]
readTodayOnBusiness(fname) ==
let mk_(rslt, mk_(y,m,d)) = io.freadval[int * int * int](fname)
in
if rslt then
return getDateFrom_yyyy_mm_dd(y,m,d)
else
let - = io.echo("Can't read BaseDay's data file.")
in
return nil;
--get today for test
public todayOnBusiness: () ==> Date
todayOnBusiness() ==
if iTodayOnBusiness = nil then
return readTodayOnBusiness(homedir ^ "/temp/BaseDay.txt")
else
return iTodayOnBusiness;
public readFromFiletodayOnBusiness: seq of char ==> Date
readFromFiletodayOnBusiness(fname) ==
if iTodayOnBusiness = nil then
return readTodayOnBusiness(fname)
else
return iTodayOnBusiness;
public setTodayOnBusiness : Date ==> ()
setTodayOnBusiness(date) == iTodayOnBusiness := date;
-- get today for system. For example, many business systems thinks just after midnight is as "today"
public todayOnCompany: seq of char ==> Date
todayOnCompany(companyCode) ==
(
if iTodayOnCompanyMap = nil then
setTodayOnCompany(companyCode,todayOnBusiness());
return iTodayOnCompanyMap(companyCode)
);
public setTodayOnCompany : seq of char * Date ==> ()
setTodayOnCompany(companyCode,date) == iTodayOnCompanyMap := iTodayOnCompanyMap ++ { companyCode |-> date };
public readSystemTime : () ==> [Time]
readSystemTime() ==
let mk_(rslt, now) = io.freadval[Time](homedir ^ "/temp/SystemTime.txt")
in
if rslt then
return now
else
let - = io.echo("Can't read System Time data file.")
in
return nil;
public systemTime : () ==> Time
systemTime() ==
if timeOfSystem = nil then
readSystemTime()
else
return timeOfSystem;
public setSystemTime : Time ==> ()
setSystemTime(t) == timeOfSystem := t;
public SBCalendar : () ==> SBCalendar
SBCalendar() ==
(
setDifferenceWithGMT(differenceBetweenGMTandJST);
return self
);
end SBCalendar
\end{vdm_al}
\begin{rtinfo}
[SBCalendar]{vdm.tc}[SBCalendar]
\end{rtinfo}
¤ Dauer der Verarbeitung: 0.19 Sekunden
(vorverarbeitet)
¤
|
Haftungshinweis
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.
|