{"id":1513,"date":"2012-08-18T12:14:24","date_gmt":"2012-08-18T10:14:24","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=1513"},"modified":"2012-08-18T21:38:13","modified_gmt":"2012-08-18T19:38:13","slug":"snippet-kalender-ausdrucken-teil-2-von-bis","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2012\/08\/snippet-kalender-ausdrucken-teil-2-von-bis\/","title":{"rendered":"Snippet: Kalender ausdrucken, Teil 2: von-bis"},"content":{"rendered":"<p>Die <a href=\"http:\/\/www.tutego.de\/blog\/javainsel\/2012\/08\/snippet-kalender-des-jahrs-ausgeben\/\">erste Version meines Kalenderprogramms<\/a> druckte ein Kalender f\u00fcr ein Jahr. In Anwendungen d\u00fcrfte h\u00e4ufiger vorkommen, dass es ein Start- und Enddatum gibt, das auch \u00fcber Jahresgrenzen liegt. Das macht dieses Programm: <\/p>\n<p>public static class CalLine   <br \/>{    <br \/>&#160; public int year;    <br \/>&#160; public int weekOfYear;    <br \/>&#160; public int month = -1;&#160; \/\/ 0 &lt;= month &lt;= 11     <br \/>&#160; public int[] day = { -1, -1, -1, -1, -1, -1, -1 };     <br \/>}    <\/p>\n<pre class=\"csharpcode\"><span class=\"kwrd\">public<\/span> <span class=\"kwrd\">static<\/span> List&lt;CalLine&gt; calenderOfTheYear( Date start, Date end )\n{\n  Calendar startCal = <span class=\"kwrd\">new<\/span> GregorianCalendar();\n  startCal.setTime( start );\n  Calendar endCal = <span class=\"kwrd\">new<\/span> GregorianCalendar();\n  endCal.setTime( end );\n  <span class=\"kwrd\">return<\/span> calenderOfTheYear( startCal, endCal );\n}\n\n<span class=\"kwrd\">public<\/span> <span class=\"kwrd\">static<\/span> List&lt;CalLine&gt; calenderOfTheYear( Calendar start, Calendar end )\n{\n  List&lt;CalLine&gt; lines = <span class=\"kwrd\">new<\/span> ArrayList&lt;&gt;();\n\n  <span class=\"rem\">\/\/ Calender instances are mutable, so copy them<\/span>\n  Calendar startCal = (Calendar) start.clone(); \n  Calendar endCal   = (Calendar) end.clone(); \n\n  <span class=\"rem\">\/\/ For start date: first go backwards to the beginning of the month<\/span>\n  <span class=\"rem\">\/\/ then find monday of this week<\/span>\n  <span class=\"kwrd\">while<\/span> ( startCal.get( Calendar.DAY_OF_MONTH ) != 1 )\n    startCal.add( Calendar.DAY_OF_YEAR, -1 );\n  <span class=\"kwrd\">while<\/span> ( startCal.get( Calendar.DAY_OF_WEEK ) != Calendar.MONDAY )\n    startCal.add( Calendar.DAY_OF_YEAR, -1 );\n\n  <span class=\"rem\">\/\/ For end date: go forwards and find end of month<\/span>\n  <span class=\"rem\">\/\/ then find sunday of this week<\/span>\n  <span class=\"kwrd\">while<\/span> ( endCal.get( Calendar.DAY_OF_MONTH ) != startCal.getActualMaximum( Calendar.DAY_OF_MONTH ) )\n    endCal.add( Calendar.DAY_OF_YEAR, 1 );\n  <span class=\"kwrd\">while<\/span> ( endCal.get( Calendar.DAY_OF_WEEK ) != Calendar.SUNDAY )\n    endCal.add( Calendar.DAY_OF_YEAR, 1 );\n  endCal.add( Calendar.DAY_OF_YEAR, 1 );  <span class=\"rem\">\/\/ add 1 to test with &lt; not &lt;=<\/span>\n\n  CalLine line = <span class=\"kwrd\">new<\/span> CalLine();\n\n  <span class=\"kwrd\">while<\/span> ( startCal.before( endCal ) ) {\n    <span class=\"kwrd\">if<\/span> ( line.year == 0 )\n      line.year = startCal.get( Calendar.YEAR );\n    <span class=\"kwrd\">if<\/span> ( line.weekOfYear == 0 )\n      line.weekOfYear = startCal.get( Calendar.WEEK_OF_YEAR );\n\n    <span class=\"kwrd\">int<\/span> dayOfMonth = startCal.get( Calendar.DAY_OF_MONTH );\n    <span class=\"kwrd\">int<\/span> dayOfWeek  = startCal.get( Calendar.DAY_OF_WEEK );\n\n    <span class=\"kwrd\">if<\/span> ( dayOfMonth == 1 )\n      line.month = startCal.get( Calendar.MONTH );\n\n    line.day[dayOfWeek - 1] = dayOfMonth;\n\n    <span class=\"kwrd\">if<\/span> ( dayOfWeek == Calendar.SUNDAY ) {\n      <span class=\"rem\">\/\/ Days are Sun, Mon, ..., Sat. Rearange to Mon, ..., Sun <\/span>\n      <span class=\"kwrd\">int<\/span> first = line.day[ 0 ]; <span class=\"rem\">\/\/ This is faster then System.arraycopy()<\/span>\n      line.day[ 0 ] = line.day[ 1 ]; line.day[ 1 ] = line.day[ 2 ]; line.day[ 2 ] = line.day[ 3 ];\n      line.day[ 3 ] = line.day[ 4 ]; line.day[ 4 ] = line.day[ 5 ]; line.day[ 5 ] = line.day[ 6 ];\n      line.day[ 6 ] = first;\n\n      lines.add( line );\n      line = <span class=\"kwrd\">new<\/span> CalLine();   <span class=\"rem\">\/\/ it ends always with SUN, last line is not added<\/span>\n    }\n\n    startCal.add( Calendar.DAY_OF_YEAR, 1 );\n  }\n\n  <span class=\"kwrd\">return<\/span> lines;\n}<\/pre>\n<style type=\"text\/css\">\n<p>.csharpcode, .csharpcode pre\n{\n\tfont-size: small;\n\tcolor: black;\n\tfont-family: consolas, \"Courier New\", courier, monospace;\n\tbackground-color: #ffffff;\n\t\/*white-space: pre;*\/\n}\n.csharpcode pre { margin: 0em; }\n.csharpcode .rem { color: #008000; }\n.csharpcode .kwrd { color: #0000ff; }\n.csharpcode .str { color: #006080; }\n.csharpcode .op { color: #0000c0; }\n.csharpcode .preproc { color: #cc6633; }\n.csharpcode .asp { background-color: #ffff00; }\n.csharpcode .html { color: #800000; }\n.csharpcode .attr { color: #ff0000; }\n.csharpcode .alt \n{\n\tbackground-color: #f4f4f4;\n\twidth: 100%;\n\tmargin: 0em;\n}\n.csharpcode .lnum { color: #606060; }<\/style>\n<p>Beispielaufruf:<\/p>\n<pre class=\"csharpcode\">List&lt;CalLine&gt; lines = DateUtils.calenderOfTheYear( <span class=\"kwrd\">new<\/span> GregorianCalendar( 2011, Calendar.NOVEMBER, 12 ), <span class=\"kwrd\">new<\/span> GregorianCalendar( 2012, Calendar.JANUARY, 22 ) );\n\nString[] monthNames = { <span class=\"str\">&quot;Jan&quot;<\/span>, <span class=\"str\">&quot;Feb&quot;<\/span>, <span class=\"str\">&quot;Mrz&quot;<\/span>, <span class=\"str\">&quot;Apr&quot;<\/span>, <span class=\"str\">&quot;Mai&quot;<\/span>, <span class=\"str\">&quot;Jun&quot;<\/span>, <span class=\"str\">&quot;Jul&quot;<\/span>, <span class=\"str\">&quot;Aug&quot;<\/span>, <span class=\"str\">&quot;Sep&quot;<\/span>, <span class=\"str\">&quot;Okt&quot;<\/span>, <span class=\"str\">&quot;Nov&quot;<\/span>, <span class=\"str\">&quot;Dez&quot;<\/span> };\nSystem.<span class=\"kwrd\">out<\/span>.println( <span class=\"str\">&quot;KW        Mo Do Mi Do Fr Sa So&quot;<\/span> ); <span class=\"rem\">\/\/ to lazy for DateFormatSymbols here...<\/span>\n\n<span class=\"kwrd\">for<\/span> ( CalLine l : lines ) {\n  String monthStr = (l.month == -1) ? <span class=\"str\">&quot;   &quot;<\/span> : monthNames[ l.month ];\n  String s = String.format( <span class=\"str\">&quot;%2d  %s   %(2d %(2d %(2d %(2d %(2d %(2d %(2d&quot;<\/span>,\n                            l.weekOfYear, monthStr,\n                            l.day[0], l.day[1], l.day[2], l.day[3], l.day[4], l.day[5], l.day[6] ).replace( <span class=\"str\">&quot;(1)&quot;<\/span>, <span class=\"str\">&quot;  &quot;<\/span> );\n  System.<span class=\"kwrd\">out<\/span>.println( s );\n}<\/pre>\n<style type=\"text\/css\">\n<p>.csharpcode, .csharpcode pre\n{\n\tfont-size: small;\n\tcolor: black;\n\tfont-family: consolas, \"Courier New\", courier, monospace;\n\tbackground-color: #ffffff;\n\t\/*white-space: pre;*\/\n}\n.csharpcode pre { margin: 0em; }\n.csharpcode .rem { color: #008000; }\n.csharpcode .kwrd { color: #0000ff; }\n.csharpcode .str { color: #006080; }\n.csharpcode .op { color: #0000c0; }\n.csharpcode .preproc { color: #cc6633; }\n.csharpcode .asp { background-color: #ffff00; }\n.csharpcode .html { color: #800000; }\n.csharpcode .attr { color: #ff0000; }\n.csharpcode .alt \n{\n\tbackground-color: #f4f4f4;\n\twidth: 100%;\n\tmargin: 0em;\n}\n.csharpcode .lnum { color: #606060; }<\/style>\n<p>Das f\u00fchrt zu<\/p>\n<pre>KW        Mo Do Mi Do Fr Sa So\n44  Nov   31  1  2  3  4  5  6\n45         7  8  9 10 11 12 13\n46        14 15 16 17 18 19 20\n47        21 22 23 24 25 26 27\n48  Dez   28 29 30  1  2  3  4\n49         5  6  7  8  9 10 11\n50        12 13 14 15 16 17 18\n51        19 20 21 22 23 24 25\n52  Jan   26 27 28 29 30 31  1\n 1         2  3  4  5  6  7  8\n 2         9 10 11 12 13 14 15\n 3        16 17 18 19 20 21 22\n 4        23 24 25 26 27 28 29\n 5  Feb   30 31  1  2  3  4  5<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Die erste Version meines Kalenderprogramms druckte ein Kalender f\u00fcr ein Jahr. In Anwendungen d\u00fcrfte h\u00e4ufiger vorkommen, dass es ein Start- und Enddatum gibt, das auch \u00fcber Jahresgrenzen liegt. Das macht dieses Programm: public static class CalLine { &#160; public int year; &#160; public int weekOfYear; &#160; public int month = -1;&#160; \/\/ 0 &lt;= month [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[68],"tags":[],"class_list":["post-1513","post","type-post","status-publish","format-standard","hentry","category-snippet"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/1513","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=1513"}],"version-history":[{"count":4,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/1513\/revisions"}],"predecessor-version":[{"id":1517,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/1513\/revisions\/1517"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=1513"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=1513"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=1513"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}