날짜 발생


9

음수가 아닌 3 개의 정수 y, md(적어도 하나는 양수 여야 함)와 양수가 연도 인 유효한 날짜 (연도, 월, 일을 포함하는 합리적인 형식으로 추가 정보는 없음)가 제공되면 이다 날짜 y년, m월, d원래 날짜 이후 일.

그레고리오 력은 모든 날짜 (그레고리오 력이 채택되기 전의 날짜)에 사용됩니다.

다음 날짜를 계산하는 방법은 다음과 같습니다.

  1. y연도에 추가
  2. m이 달에 추가
  3. 롤오버를 적용하여 날짜 정규화 (예 : 2018-13-01-> 2019-01-01)
  4. 날짜가 해당 월의 마지막 날을 지난 경우 해당 월의 마지막 날로 변경하십시오 (예 : 2018-02-30-> 2018-02-28)
  5. d하루에 추가
  6. 롤오버를 적용하여 날짜 정규화 (예 : 2019-01-32-> 2019-02-01)

윤년 (4로 나눌 수 있지만 400으로 나눌 수없는 한 100으로 나눌 수없는 년)은 적절하게 처리해야합니다. 모든 입력 및 출력은 사용자 언어의 표현 가능한 정수 범위 내에 있습니다.

테스트 사례

테스트 케이스는 형식으로 제공되며 input => output여기서 inputJSON 오브젝트는 있습니다.

{"date":"2018-01-01","add":{"d":1}} => 2018-01-02
{"date":"2018-01-01","add":{"M":1}} => 2018-02-01
{"date":"2018-01-01","add":{"Y":1}} => 2019-01-01
{"date":"2018-01-30","add":{"M":1}} => 2018-02-28
{"date":"2018-01-30","add":{"M":2}} => 2018-03-30
{"date":"2000-02-29","add":{"Y":1}} => 2001-02-28
{"date":"2000-02-29","add":{"Y":4}} => 2004-02-29
{"date":"2000-01-30","add":{"d":2}} => 2000-02-01
{"date":"2018-01-01","add":{"Y":2,"M":3,"d":4}} => 2020-04-05
{"date":"2018-01-01","add":{"Y":5,"M":15,"d":40}} => 2024-05-11

이 JSFiddle 을 테스트에 사용할 수 있습니다 .

이것은 따라서 각 언어에서 가장 짧은 솔루션이 이깁니다.



2
@LuisfelipeDejesusMunoz PPCG의 표준과 마찬가지로 입력 형식은 중요하지 않습니다.
Mego

의 상한에 대한 제한이 y, m그리고 d(예 : 수 d2,147,483,000 수?)
ErikF

@ErikFAll inputs and outputs will be within the representable integer range of your language.
Mego

1
출력 형식은 어떻습니까? 날짜 객체를 출력 할 수 있습니까? 날짜 개체를 취할 수 있습니까?
Asone Tuhid

답변:


3

C (gcc) , 291 바이트

이것은 JS 내장과 동일한 값을 반환하는 것이 매우 재미있었습니다.

z,m=0xEEFBB3;int*y;g(){z=28+(m>>y[1]*2&3)+!(y[1]-1)*(!(*y%4)&&(*y%100)||!(*y%400));}h(a){z=(a>g())?g():a;}j(){*y+=y[1]/12;y[1]%=12;y[2]=h(y[2]);}f(int*a){y=a+6;for(z=0;z<3;z++)y[z]=a[z];y[1]--;j();*y+=a[3];y[1]+=a[4];j();y[2]+=a[5];for(;y[2]>h(y[2]);(y[1]=++y[1]%12)||++*y)y[2]-=g();y[1]++;}

온라인으로 사용해보십시오!

언 골프 :

// De No Oc Se Au Jl Jn Ma Ap Mr Fe Ja
// 31 30 31 30 31 31 30 31 30 31 28 31 = Month length
// 11 10 11 10 11 11 10 11 10 11 00 11 = Offset (2-bit representation)
//   E     E     F     B     B     3   = Hex representation

int m=0xEEFBB3; // Month lengths-28 in reverse order, stored as 2 bits/month
int *y; // Pointer to the output date, shared as a global between calls

// Regenerate month length and add leap day
int days_month(void) { 
  return 28+(m>>y[1]*2&3)+!(y[1]-1)*(!(*y%4)&&(*y%100)||!(*y%400));
}

int calendar_day(int day) { return day>days_month()?days_month():day; }

void truncate_date(void) {
  *y+=y[1]/12; y[1]%=12;
  y[2]=calendar_day(y[2]);
}

void f(int *a) {
  int z;
  y=a+6;
  for(z=0;z<3;z++)y[z]=a[z];y[1]--; // Convert month to 0-based
  truncate_date();
  *y+=a[3]; y[1]+=a[4]; truncate_date();
  y[2]+=a[5];
  for(;y[2]>calendar_day(y[2]);(y[1]=++y[1]%12)||++*y)
    y[2]-=days_month();
  y[1]++; // Return month to 1-based
}

온라인으로 사용해보십시오!



1

perl -MDate :: Calc = : all -E, 28 바이트

$,=$";say Add_Delta_YMD@ARGV

여기에는 입력 연도, 월 및 날짜 (별도의 인수) 및 추가 할 연도, 월 및 일의 6 가지 인수가 필요합니다.


2
이 때문에 테스트 케이스의 일부 실패, 기발한 작업의 "규칙 4"로 취급하지 않습니다 -. 예를 들어, perl -MDate::Calc=:all -E '$,=$";say Add_Delta_YMD@ARGV' -- 2000 2 29 1 0 0반환 2001 3 1하는 대신 2001 2 28영업 이익 예상하는 (테스트 케이스 6) 등.
sundar-복원 모니카

1

R , 88 바이트

function(Y,M,D,y,m,d,o=M+m){while(is.na(x<-ISOdate(Y+y+o%/%12,o%%12,D)))D=D-1;x+864e2*d}

온라인으로 사용해보십시오!

Y,M,D날짜에 대해 3 개의 인수 ( y,m,d)를 추가하고 추가 할 값에 대해 다른 3 개의 인수 ( )를 취하는 함수입니다 .

출력 미리 추가되어 12:00:00 GMT기본 형식을위한 ISOdate


1

펄 6 ,  60 50 45  44 바이트

{Date.new($^a).later(:$:year).later(:$:month).later(:$:day)}

테스트 (60)
입력( "2000-02-29", year => 1, month => 0, day => 0 )


{$^a.later(:$:year).later(:$:month).later(:$:day)}

테스트 (50)
입력( Date.new("2000-02-29"), year => 1, month => 0, day => 0 )


{$/=$^a;$/.=later(|$_) for |[R,] $^b.sort;$/}

테스트 (45)
입력 ( Date.new("2000-02-29"), %( year => 1 ) )
값 (값이 0 인 키를 포함하지 않아도 됨)


{$/=$^a;$/.=later(|$_) for |[R,] %_.sort;$/}

테스트 (44)
입력( Date.new("2000-02-29"), year => 1 )

넓히는:

{  # bare block lambda

  $/ = $^a; # store only positional param into a modifiable scalar
            # (params are readonly by default)


  # do a loop over the data to add

  $/ .= later(    # add using Date.later()
    |$_           # turn current iterated Pair into a named parameter
  )

    for

      |           # flatten so that `for` will iterate

        [R,]      # shorter than `reverse` (year=>1, month=>0, day=>0)

          %_.sort # sort the named arguments (day=>0, month=>0, year=>1)
  ;

  # return new Date
  $/
}

당신은 전에 공간을 제거 할 수 있습니다for
조 왕


1

자바 8, 51 바이트

(s,y,m,d)->s.plusYears(y).plusMonths(m).plusDays(d)

입력 ( s)과 출력 모두 java.time.LocalDate입니다.

온라인으로 사용해보십시오.

설명:

(s,y,m,d)->        // Method with LocalDate and 3 int parameters and LocalDate return-type
  s.plusYears(y)   //  Add the years to the input start-Date
   .plusMonths(m)  //  Add the months as well
   .plusDays(d)    //  And add the days as well

1

R , 65 바이트

function(x,y){require(lubridate)
x%m+%period(y,c("ye","mo","d"))}

lubridate패키지를 사용합니다 . %m+%중위 연산자는 설탕이다 add_with_rollback본질적 질문을 요청 무엇을 구현 기능.

TIO는 없습니다 lubridate당신이 수 대신 그것은 여기 시도f <-테스트 케이스와 함께 위의 기능에 앞에 추가 :

f(as.Date("2018-01-01"),c(0,0,1))
f(as.Date("2018-01-01"),c(0,1,0))
f(as.Date("2018-01-01"),c(1,0,0))
f(as.Date("2018-01-30"),c(0,1,0))
f(as.Date("2018-01-30"),c(0,2,0))
f(as.Date("2000-02-29"),c(1,0,0))
f(as.Date("2000-02-29"),c(4,0,0))
f(as.Date("2000-01-30"),c(0,0,2))
f(as.Date("2018-01-01"),c(2,3,4))
f(as.Date("2018-01-01"),c(5,15,40))

다음과 같은 방법으로 2 바이트를 절약 할 수 있습니다. function(x,y)x%m+%period(y,c("ye","mo","d")) require(lubridate)(기능이
필요함

0

배시 , 150 149 바이트

a=$2+$5-1+b
y=$1+$4+a/12
m=1+a%12
d=date
$d -d@$[$($d +%s+$6*86400 -d$[y]-$[m]-$($d +$3%n%d -d@$[`b=1;$d +%s-86400 -d$[y]-$[m]-1`]|sort -n|head -1))]

온라인으로 사용해보십시오!

명령 행 인수를 통해 입력 : 구년, 구월, 구일. 연도 변경, 월 변경, 일 변경. Wed Feb 28 00:00:00 UTC 2018stdout 과 같은 문자열을 출력합니다 .



0

T-SQL, 53 바이트

SELECT DATEADD(D,d,DATEADD(M,m,DATEADD(Y,y,a)))FROM t

중요하지는 않지만 년 조정, 월 조정, 일을 적용합니다. 모든 테스트 값을 확인하십시오.

IO 표준에 따라 입력 필드 날짜 필드 a 및 정수 필드 y , md가 있는 기존 테이블 t 에서 가져옵니다 .

흥미롭게도 날짜 유형 코드 ( D , MY )와 입력 값 ( d , my ) 사이에서 중요한 것은 대문자가 아니라 단순히 SQL DATEADD함수 의 매개 변수 순서입니다 .


1
테스트 사례 6을 통과합니까? 규칙 4를 구현하지 않았기 때문에 입력 6 2001 3 1대신에 제공한다고 생각합니다 2001 2 28.
sundar-Reinstate Monica

@sundar 당신이 옳은 것 같습니다; 나는 모든 테스트 사례를 통과했다고 생각했다. 그것이 고칠 수 있는지 살펴 보겠습니다 ...
BradC
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.