質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.34%

Javascriptでの日付計算について

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,078

syu_2016

score 12

発送予定日を自動計算です。
最終的に日時(月/日)と曜日を分けて出力したいと思っております。
現状:日時(月/日)と曜日がセットで出力されてしまいます。。。
アドバイスいただけないでしょうか??

素人ですのでお手柔らかにお願いします。。。

<SCRIPT language="JavaScript">

thisDay = new Date();
timeStamp = thisDay.getTime();
myMonth = thisDay.getMonth() + 1;
myDate  = thisDay.getDate();
myHours = thisDay.getHours();
myDay   = thisDay.getDay();
myWeekTbl = new Array( "日","月","火","水","木","金","土" );

function isHoliday (year, month, date, nday) {
  nofw    = Math.floor((date - 1) / 7) + 1;
  shunbun = Math.floor(20.8431+0.242194*(year-1980)-Math.floor((year-1980)/4));
  syubun  = Math.floor(23.2488+0.242194*(year-1980)-Math.floor((year-1980)/4));
  if (month ==  1 && date ==  1)               { return 1; } // 元旦
  if (month ==  1 && nday ==  1 && nofw ==  2) { return 1; } // 成人の日
  if (month ==  2 && date == 11)               { return 1; } // 建国記念の日
  if (month ==  3 && date == shunbun)          { return 1; } // 春分の日
  if (month ==  4 && date == 29)               { return 1; } // みどりの日
  if (month ==  5 && date >=  3 && date <=  5) { return 1; } // 憲法記念日~こどもの日
  if (month ==  7 && nday ==  1 && nofw ==  3) { return 1; } // 海の日
  if (month ==  9 && nday ==  1 && nofw ==  3) { return 1; } // 敬老の日
  if (month ==  9 && date == syubun)           { return 1; } // 秋分の日
  if (month ==  9 && nday ==  2 && nofw ==  3 
                  && date+1 == syubun) { return 1; } // 9月第3火曜の翌日が秋分の日→国民の休日
  if (month == 10 && nday ==  1 && nofw ==  2) { return 1; } // 体育の日
  if (month == 11 && date ==  3)               { return 1; } // 文化の日
  if (month == 11 && date == 23)               { return 1; } // 勤労感謝の日
  if (month == 12 && date == 23)               { return 1; } // 天皇誕生日
  if (nday  ==  0)                             { return 2; } // 日曜
  if (nday  ==  6)                             { return 2; } // 土曜
  return 0;
}

function dispDate (w) {
  return dateFormat(myMonth,myDate,myDay,w);
}

function dispDate1 (h, w) {
  return dispDate2(0, h, w);
}

function dispDate2 (n, h, w) {
  var i = 0;
  while (i <= n) {
    thisDay.setTime(timeStamp + (1000*60*60*24 * i));
    myYear2  = thisDay.getFullYear();
    myMonth2 = thisDay.getMonth() + 1;
    myDate2  = thisDay.getDate();
    myDay2   = thisDay.getDay();
    if (isHoliday(myYear2,myMonth2,myDate2,myDay2) == 0 && i == 0 && h <= myHours) { n++; }  // 翌日扱い
    if (isHoliday(myYear2,myMonth2,myDate2,myDay2) >= 1){ n++; }  // 休日
    if (isHoliday(myYear2,myMonth2,myDate2,myDay2) == 1 && myDay2 == 0){ n++; }  // 振替休日
    i++;
  }
  return dateFormat(myMonth2,myDate2,myDay2,w);

}

function dispDateW () {
  return dispDate(1);
}

function dispDate1W (h) {
  return dispDate1(h, 1);
}

function dispDate2W (n, h) {
  return dispDate2(n, h, 1);
}

function dateFormat (month, date, week, w) {
  if (w == 1) { 
  return month+"/"+date +"("+myWeekTbl[week]+")"; 
  }

  else { 
  return month+"/"+date +"("+myWeekTbl[week]+")"; 
  }
}

// -->
</SCRIPT>

■追記です---------------------------------------------------------------------

dispDate1W dispDate2Wを現在出力しております。

<script type="text/javascript">
document.getElementById("ClockArea01").innerHTML = "<span class='txt01'>" + (dispDate1W(19))+ "</span><span class='txt01'> 12:00</span>" ;
document.getElementById("ClockArea02").innerHTML = "<span class='txt02'>" + (dispDate2W(2,19))+ "</span>" ;
</SCRIPT>

以下の部分で月/日/曜日がまとまっております。

function dateFormat (month, date, week, w) {
 if (w == 1) { return month+"/"+date +"("+myWeekTbl[week]+")"; }
 else { return month+"/"+date +"("+myWeekTbl[week]+")"; } 
}

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • ItoTomonori

    2016/04/12 10:55

    そこまで理解されているなら、dateFormat、dispDateX、を書き換える?だけという所まで理解されているかと思いますが・・・?

    キャンセル

  • suzukis

    2016/04/12 10:59

    コードの部分は、```(バッククオート3つ)の行で囲むと見やすくなります。範囲選択して、'</>'のボタンでもよいです

    キャンセル

  • Lhankor_Mhy

    2016/04/12 17:22

    質問からずれますが、javascriptでの時間表示はローカルでの時刻設定によります。たとえば実際には19時を過ぎているのに顧客PCの時計が遅れていたため、発送予定日が1日前にずれる、ということがあり得ます。
    日時表示の誤記がトラブルの原因になりそうでしたら、サーバの時刻を取得して表示することをお勧めします。

    キャンセル

回答 2

+1

始めの7行で既に望む結果は得られているように読めます。

thisDay = new Date(); 
timeStamp = thisDay.getTime(); 
myMonth = thisDay.getMonth() + 1; 
myDate  = thisDay.getDate(); 
myHours = thisDay.getHours(); 
myDay   = thisDay.getDay(); 
myWeekTbl = new Array( "日","月","火","水","木","金","土" );

下記APIについて調べる事をお勧めします。

Re: syu_2016 さん

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/12 11:30

    申し訳ありません。質問が間違っておりました。
    したいことをまとめましたのでアドバイスいただけたら幸いです。

    ■例:出力したい内容
    A箇所.4/12(火) 
    B箇所.4/14(木)

    ①現在時刻が19時までは、A箇所が当日、B箇所は当日から2日後としたい
    ②現在時刻が19時以降は、A箇所が翌日、B箇所は当日から3日後としたい
    ③A箇所が土日祝日の場合は、B箇所は翌営業日の日付に設定したい
    ※A箇所、B箇所共に、(月/日) + (曜日)といったように別々にしたものを足して出力したい

    何卒、宜しくお願いします。

    キャンセル

  • 2016/04/12 12:05

    希望する動作を漠然と書かれても困るのですが、日付を2/3日ずらす部分がわからないのでしょうか。
    86400000 を加算すれば1日後になるのでその仕組みを利用してください。

    キャンセル

checkベストアンサー

0

予想ですが、下記のように表示させたいという事でしょうか。

<span class='txt01'>4/13</span><span class='some'> (水)</span><span class='txt01'> 12:00</span>

もしそれであれば、出力部分を置換してしまうのが手かもしれませんね。

//  (dispDate1W(19))    ← この部分に replace を追加する
    (dispDate1W(19)).replace( '(', '</span><span class="some">(' )

小手先の修正を行う事で思った通りに表示されると思いますが、今後のメンテナンスコスト(後任が複雑すぎるコードに悩まされる時間を含めたコスト)軽減のため、書き直した方が良いですよ。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/14 08:49

    ありがとうございます!助かりました。希望通り解決できました。今後ともよろしくお願いします。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る