1/********************************************************************
2 * COPYRIGHT:
3 * Copyright (c) 2008-2014, International Business Machines Corporation and
4 * others. All Rights Reserved.
5 ********************************************************************/
6//! [getBestPatternExample1]
7#include <iostream>
8#include "unicode/smpdtfmt.h"
9#include "unicode/dtptngen.h"
10#include "unicode/ustdio.h"
11//! [getBestPatternExample1]
12
13using namespace std;
14
15static void getBestPatternExample() {
16
17		u_printf("========================================================================\n");
18		u_printf(" getBestPatternExample()\n");
19        u_printf("\n");
20        u_printf(" Use DateTimePatternGenerator to create customized date/time pattern:\n");
21        u_printf(" yQQQQ,yMMMM, MMMMd, hhmm, jjmm per locale\n");
22        u_printf("========================================================================\n");
23		//! [getBestPatternExample]
24	UnicodeString skeletons [] = {
25		UnicodeString("yQQQQ"), // year + full name of quarter, i.e., 4th quarter 1999
26        UnicodeString("yMMMM"), // year + full name of month, i.e., October 1999
27        UnicodeString("MMMMd"), // full name of month + day of the month, i.e., October 25
28        UnicodeString("hhmm"),  // 12-hour-cycle format, i.e., 1:32 PM
29        UnicodeString("jjmm"), // preferred hour format for the given locale, i.e., 24-hour-cycle format for fr_FR
30		0,
31	};
32
33	Locale locales[] = {
34		Locale ("en_US"),
35		Locale ("fr_FR"),
36		Locale ("zh_CN"),
37	};
38
39	const char* filename = "sample.txt";
40	/* open a UTF-8 file for writing */
41	UFILE* f = u_fopen(filename, "w", NULL,"UTF-8");
42	UnicodeString dateReturned;
43	UErrorCode status =U_ZERO_ERROR;
44	Calendar *cal = Calendar::createInstance(status);
45	cal->set (1999,9,13,23,58,59);
46	UDate date = cal->getTime(status);
47	u_fprintf(f, "%-20S%-20S%-20S%-20S\n", UnicodeString("Skeleton").getTerminatedBuffer(),UnicodeString("en_US").getTerminatedBuffer(),UnicodeString("fr_FR").getTerminatedBuffer(),UnicodeString("zh_CN").getTerminatedBuffer());
48	for (int i=0;skeletons[i]!=NULL;i++) {
49		u_fprintf(f, "%-20S",skeletons[i].getTerminatedBuffer());
50		for (int j=0;j<sizeof(locales)/sizeof(locales[0]);j++) {
51			// create a DateTimePatternGenerator instance for given locale
52			DateTimePatternGenerator *dtfg= DateTimePatternGenerator::createInstance(locales[j],status);
53			// use getBestPattern method to get the best pattern for the given skeleton
54			UnicodeString pattern = dtfg->getBestPattern(skeletons[i],status);
55			// Constructs a SimpleDateFormat with the best pattern generated above and the given locale
56			SimpleDateFormat *sdf = new SimpleDateFormat(pattern,locales[j],status);
57			dateReturned.remove();
58			// Get the format of the given date
59			sdf->format(date,dateReturned,status);
60			/* write Unicode string to file */
61			u_fprintf(f, "%-20S", dateReturned.getTerminatedBuffer());
62			delete dtfg;
63			delete sdf;
64		}
65		u_fprintf(f,"\n");
66	}
67	/* close the file resource */
68	u_fclose(f);
69	delete cal;
70	//! [getBestPatternExample]
71}
72
73static void addPatternExample() {
74
75		u_printf("========================================================================\n");
76        u_printf(" addPatternExample()\n");
77		u_printf("\n");
78        u_printf(" Use addPattern API to add new '. von' to existing pattern\n");
79        u_printf("========================================================================\n");
80		//! [addPatternExample]
81		UErrorCode status =U_ZERO_ERROR;
82		UnicodeString conflictingPattern,dateReturned, pattern;
83		Locale locale=Locale::getFrance();
84		Calendar *cal = Calendar::createInstance(status);
85		cal->set (1999,9,13,23,58,59);
86		UDate date = cal->getTime(status);
87        // Create an DateTimePatternGenerator instance for the given locale
88		DateTimePatternGenerator *dtfg= DateTimePatternGenerator::createInstance(locale,status);
89		SimpleDateFormat *sdf = new SimpleDateFormat(dtfg->getBestPattern("MMMMddHmm",status),locale,status);
90        // Add '. von' to the existing pattern
91        dtfg->addPattern("dd'. von' MMMM", true, conflictingPattern,status);
92        // Apply the new pattern
93        sdf->applyPattern(dtfg->getBestPattern("MMMMddHmm",status));
94		dateReturned = sdf->format(date, dateReturned, status);
95		pattern =sdf->toPattern(pattern);
96		u_printf("%s\n", "New Pattern for FRENCH: ");
97      	u_printf("%S\n", pattern.getTerminatedBuffer());
98		u_printf("%s\n", "Date Time in new Pattern: ");
99		u_printf("%S\n", dateReturned.getTerminatedBuffer());
100		delete dtfg;
101		delete sdf;
102		delete cal;
103
104		//! [addPatternExample]
105        /* output of the sample code:
106        ************************************************************************************************
107         New Pattern for FRENCH: dd. 'von' MMMM HH:mm
108         Date Time in new Pattern: 13. von octobre 23:58
109
110        *************************************************************************************************/
111 	}
112
113static void replaceFieldTypesExample() {
114		// Use repalceFieldTypes API to replace zone 'zzzz' with 'vvvv'
115       u_printf("========================================================================\n");
116       u_printf(" replaceFieldTypeExample()\n");
117       u_printf("\n");
118       u_printf(" Use replaceFieldTypes API to replace zone 'zzzz' with 'vvvv'\n");
119       u_printf("========================================================================\n");
120	   //! [replaceFieldTypesExample]
121		UFILE *out = u_finit(stdout, NULL, "UTF-8");
122		UErrorCode status =U_ZERO_ERROR;
123		UnicodeString pattern,dateReturned;
124		Locale locale =Locale::getFrance();
125		Calendar *cal = Calendar::createInstance(status);
126		cal->set (1999,9,13,23,58,59);
127		UDate date = cal->getTime(status);
128		TimeZone *zone = TimeZone::createTimeZone(UnicodeString("Europe/Paris"));
129		DateTimePatternGenerator *dtfg = DateTimePatternGenerator::createInstance(locale,status);
130	    SimpleDateFormat *sdf = new SimpleDateFormat("EEEE d MMMM y HH:mm:ss zzzz",locale,status);
131		sdf->setTimeZone(*zone);
132		pattern = sdf->toPattern(pattern);
133		u_fprintf(out, "%S\n", UnicodeString("Pattern before replacement:").getTerminatedBuffer());
134      	u_fprintf(out, "%S\n", pattern.getTerminatedBuffer());
135		dateReturned.remove();
136		dateReturned = sdf->format(date, dateReturned, status);
137		u_fprintf(out, "%S\n", UnicodeString("Date/Time format in fr_FR:").getTerminatedBuffer());
138		u_fprintf(out, "%S\n", dateReturned.getTerminatedBuffer());
139        // Replace zone "zzzz" in the pattern with "vvvv"
140		UnicodeString newPattern = dtfg->replaceFieldTypes(pattern, "vvvv", status);
141		// Apply the new pattern
142		sdf->applyPattern(newPattern);
143		dateReturned.remove();
144		dateReturned = sdf->format(date, dateReturned, status);
145		u_fprintf(out, "%S\n", UnicodeString("Pattern after replacement:").getTerminatedBuffer());
146     	u_fprintf(out, "%S\n", newPattern.getTerminatedBuffer());
147     	u_fprintf(out, "%S\n", UnicodeString("Date/Time format in fr_FR:").getTerminatedBuffer());
148		u_fprintf(out, "%S\n", dateReturned.getTerminatedBuffer());
149		delete sdf;
150		delete dtfg;
151		delete zone;
152		delete cal;
153		u_fclose(out);
154	//! [replaceFieldTypesExample]
155    }
156
157int main (int argc, char* argv[])
158{
159	getBestPatternExample();
160	addPatternExample();
161	replaceFieldTypesExample();
162	return 0;
163}
164