[완료]Perl 카운트다운 로직 - 다시 질문입니다.

lovethecorners의 이미지

얼마전에 주말, 공휴일 등등을제외한 business days를 구하는법을 올렸고 해결했습니다. 다른일로 바쁘다가 이일을 다시 시작했는데, 카운트다운에서 또 막혀버리네요.

예를 들어서 10월 10일 부터 12월 1일까지의 전체 business days를 구하고 - 주말과 공휴일 등은 제외 - 그 전체 business days에서 12월 1일까지 날짜가 바뀔때 마다 하루씩 줄여서 카운트를 해야하는데... 어떤 방식으로 해야할지 감이 잡히지 않습니다.

무식한 생각으로는 10월 10일 ~ 12월 1일까지 날짜들을 차례로 배열로 만들어 놓고 그 배열에서 오늘날짜와 같은 날짜가 매치가되면 -1 씩해서 보이게 만들면 될까 등등 생각을 하고있는데, 혹시 좋은 방법이 있는데 그것을 못 찾는지도 모르겠고해서 다시 질문드리게되었네요.

aero의 이미지

복잡하게 생각할 것 없이 그냥 목표일 까지 루프를 돌며( add_days같은 함수 등으로 )
매 날짜 간의 business days를 구해서 공휴일은 그냥 무시하고 나머지는 -1하면 되지 않나요?

lovethecorners의 이미지

감사합니다. aero님....

시간적 여유가 있으면 더 알려주실수있으신가요? "매 날짜 간의 business days를 구해서"라고 말씀하신게 정확하게 이해가 않되네요... 짧게 code도 몇줄 추가해주시면 감사하겠습니다. 무리한 부탁인것 알지만... 죄송합니다. 즐거운 추석 보내세요.

---------------------------
http://pwbmini.tistory.com/

aero의 이미지

예전에 말씀하셨던 Date::Business 모듈 ( http://search.cpan.org/perldoc?Date::Business )을 사용해서 해보면

#!/usr/bin/env perl
use strict;
use warnings;
use Date::Business;
 
my $from = Date::Business->new( DATE => '20090901' );
my $to   = Date::Business->new( DATE => '20091012' );
 
while ( ! $from->gt($to) ) {
    print $from->image," D-",$to->diffb($from),"\n";
    $from->nextb();
}

결과

20090901 D-29
20090902 D-28
20090903 D-27
20090904 D-26
20090907 D-25
20090908 D-24
20090909 D-23
20090910 D-22
20090911 D-21
20090914 D-20
20090915 D-19
20090916 D-18
20090917 D-17
20090918 D-16
20090921 D-15
20090922 D-14
20090923 D-13
20090924 D-12
20090925 D-11
20090928 D-10
20090929 D-9
20090930 D-8
20091001 D-7
20091002 D-6
20091005 D-5
20091006 D-4
20091007 D-3
20091008 D-2
20091009 D-1
20091012 D-0
lovethecorners의 이미지

아, 정말 감사합니다.
전 그 모듈을 보고도 이렇게 할수있다고 생각을 못했습니다 -_-; 제가 응용력이 많이 부족함을 느낌니다. 만들어 주신 코드를 잘 응용해보겠습니다. 몇줄이면 끝나는것을 따로 배열을 만들고 그것들을 비교해서 등등... 그런 생각만했습니다. 머리가 나쁘니 손가락이 고생하네요.
---------------------------
http://pwbmini.tistory.com/

lovethecorners의 이미지

혹시 aero님 시간되시면 한번만 더 봐주시면 고맙겠습니다
Date::Business를 이용해서 다음처럼 만들어 봤습니다.

($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime();
$mon=$mon+1;
$year+=1900;
if($mday =~ /^\d$/){ $mday = "0$mday"; }
if($mon =~ /^\d$/){ $mon = "0$mon"; }
$todaysdate="$year$mon$mday";
 
$get_starts_date = new Date::Business(DATE => 20090909, HOLIDAY => \&holiday);
$get_ends_date = Date::Business->new(DATE => 20091110, HOLIDAY => \&holiday);
while ( !$get_starts_date->gt($get_ends_date) ) {
 
	if($todaysdate eq $get_starts_date->image) {
		$days_left_promo = $get_ends_date->diffb($get_starts_date);
	}
	$get_starts_date->nextb();
 
}
 
sub holiday($$) {
	my ($start, $end) = @_;
 
	my $numHolidays = 0;
	my ($holiday, @holidays);
 
	push @holidays, '20090910';
	push @holidays, '20090911';
	push @holidays, '20091008';
	push @holidays, '20091006';
	push @holidays, '20091009';
 
	foreach $holiday (@holidays) {
		$numHolidays++ if ($start le $holiday && $end ge $holiday);
	}
	return $numHolidays;
}

여기서 오늘날짜가 holiday에 있는 날짜와 겹치면 남은 날짜를 표시못하는경우가 생겼습니다. 오늘날짜와 holiday엤는 날짜가 겹치면 바로 전 business day의 카운터를 보이게 하려는데 좋은 방법없을까요?

---------------------------
http://pwbmini.tistory.com/

aero의 이미지

우리나라 2009년 9~10월 달력 그대로 입니다.

#!/usr/bin/env perl
use strict;
use warnings;
use Date::Business;
 
my $from = Date::Business->new( DATE => '20090901', HOLIDAY => \&holiday );
my $to   = Date::Business->new( DATE => '20091012', HOLIDAY => \&holiday );
 
while ( ! $from->gt($to) ) {
    print $from->image," D-",$to->diffb($from),"\n";
    $from->next();
}
 
sub holiday {
    my($start, $end) = @_;
 
    my($numHolidays) = 0;
    my($holiday, @holidays);
 
    push @holidays, '20091002'; # 추석추가공휴일
 
    foreach $holiday (@holidays) {
        $numHolidays++ if  $start le $holiday && $end ge $holiday;
    }
    return $numHolidays;
}

결과

20090901 D-28
20090902 D-27
20090903 D-26
20090904 D-25
20090905 D-25 토
20090906 D-25 일
20090907 D-24
20090908 D-23
20090909 D-22
20090910 D-21
20090911 D-20
20090912 D-20 토
20090913 D-20 일
20090914 D-19
20090915 D-18
20090916 D-17
20090917 D-16
20090918 D-15
20090919 D-15 토
20090920 D-15 일
20090921 D-14
20090922 D-13
20090923 D-12
20090924 D-11
20090925 D-10
20090926 D-10 토
20090927 D-10 일
20090928 D-9
20090929 D-8
20090930 D-7
20091001 D-6
20091002 D-6 추석추가공휴일
20091003 D-6 토
20091004 D-6 일
20091005 D-5
20091006 D-4
20091007 D-3
20091008 D-2
20091009 D-1
20091010 D-1 토
20091011 D-1 일
20091012 D-0

RTFM

lovethecorners의 이미지

고맙습니다. 그런데, 제가 질문을 잘못한것같습니다. 질문은 매일 레포트를 만들때 정해진 기간의 남은기간의 숫자를 보여줘야하거든요. 그래서 오늘날짜와 비교를해서 구해진 business day가 같으면 남은기간을 보여지도록하는 부분에 문제가있어 혹시 좋은 방법이 없나해서 질문드렸습니다. 뭔가 다르게 생각하면 그냥 풀릴것 같은문제인데, 그게 생각이 잘않되네요.

aero님 시간을 내 댓글달아주신것 감사합니다.
---------------------------
http://pwbmini.tistory.com/

aero의 이미지

제가 이해한 바로는 토.일요일이나 공휴일의 경우 바로직전 business day부터 목표일까지의 D-day를 구하고 싶으신 것이라고 생각했습니다.
마지막으로 보여드린 코드에서 $from을 오늘 날짜로하면 원하는 결과를 얻게되지 않나요?

lovethecorners님이 마지막으로 올린코드에서 $today와 nextb 함수에 의해 증가하는 $get_start_date 객체의 날짜를 비교하고 계신데 nextb함수는 날짜를 하루씩 증가시는것이 아니라 문서를 보시면 아시겠지만 날짜를 증가시키되 토.일,공휴일이면 뛰어넘고 다음 business day로 넘기는 겁니다. 그래서 저의 마지막 코드에서는 대신 next 함수를 사용했구요. 따라서 님이 마지막으로 보여주신 코드에서 어떤 의도에서인지는 모르겠지만 $today가 토,일 공휴일이라면 if($todaysdate eq $get_starts_date->image) 조건은 참이될 수가 없습니다.

lovethecorners의 이미지

아... 저도 제가 무슨 생각을 했었는지 모르겠습니다. 참 바보같았네요. 정말 감사합니다.

---------------------------
http://pwbmini.tistory.com/

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.