-1

I am using a DatePicker so that the user can select a date and find out the sunrise and sunset times for that particular date. The webservice I am using requires the date to be snet in the following format dd/MM but I would like the button to show the date in the format DDth MMMM YYYY e.g 21st March 2013

Any advice on how I should I go about doing this?

Code below as requested:

 public class SunriseSunset extends Activity implements OnClickListener {

    public Button getLocation;
    public Button setLocationJapan;
    public TextView LongCoord;
    public TextView LatCoord;
    public double longitude;
    public double latitude;
    public LocationManager lm;
    public Spinner Locationspinner;
    public DateDialogFragment frag;
    public Button date;
    public Calendar now;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sunrisesunset);

        //Date stuff
        now = Calendar.getInstance();
        date = (Button)findViewById(R.id.date_button);
        date.setText(String.valueOf(now.get(Calendar.DAY_OF_MONTH)+1)+"-"+String.valueOf(now.get(Calendar.MONTH))+"-"+String.valueOf(now.get(Calendar.YEAR)));
        date.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                showDialog();
            }
        });

    }
    // More date stuff
    public void showDialog() {
        FragmentTransaction ft = getFragmentManager().beginTransaction(); //get the fragment
        frag = DateDialogFragment.newInstance(this, new DateDialogFragmentListener(){
            public void updateChangedDate(int year, int month, int day){
                date.setText(String.valueOf(day)+"-"+String.valueOf(month+1)+"-"+String.valueOf(year));
                now.set(year, month, day);
            }
        }, now);

        frag.show(ft, "DateDialogFragment");

    }

    public interface DateDialogFragmentListener{
        //this interface is a listener between the Date Dialog fragment and the activity to update the buttons date
        public void updateChangedDate(int year, int month, int day);
    }

    public void addListenerOnSpinnerItemSelection() {
        Locationspinner = (Spinner) findViewById(R.id.Locationspinner);
        Locationspinner
                .setOnItemSelectedListener(new CustomOnItemSelectedListener(
                        this));
    }

    private class LongRunningGetIO extends AsyncTask<Void, Void, String> {

        protected String getASCIIContentFromEntity(HttpEntity entity)
                throws IllegalStateException, IOException {
            InputStream in = entity.getContent();
            StringBuffer out = new StringBuffer();
            int n = 1;
            while (n > 0) {
                byte[] b = new byte[4096];
                n = in.read(b);
                if (n > 0)
                    out.append(new String(b, 0, n));
            }
            return out.toString();
        }

        @Override
        protected String doInBackground(Void... params) {
            HttpClient httpClient = new DefaultHttpClient();
            HttpContext localContext = new BasicHttpContext();

            // Finds todays date and adds that into the URL
            SimpleDateFormat df = new SimpleDateFormat("dd/MM");
            String formattedDate = df.format(now.getTime());

            String finalURL = "http://www.earthtools.org/sun/"
                    + LatCoord.getText().toString().trim() + "/"
                    + LongCoord.getText().toString().trim() + "/"
                    + formattedDate + "/99/0";
            HttpGet httpGet = new HttpGet(finalURL);
            String text = null;

            try {
                HttpResponse response = httpClient.execute(httpGet,
                        localContext);
                HttpEntity entity = response.getEntity();
                text = getASCIIContentFromEntity(entity);
            } catch (Exception e) {
                return e.getLocalizedMessage();
            }
            return text;
        }

        protected void onPostExecute(String results) {
            if (results != null) {
                try {

                    DocumentBuilderFactory dbFactory = DocumentBuilderFactory
                            .newInstance();
                    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
                    InputSource s = new InputSource(new StringReader(results));
                    Document doc = dBuilder.parse(s);
                    doc.getDocumentElement().normalize();
                    TextView tvSunrise = (TextView) findViewById(R.id.Sunrise);
                    TextView tvSunset = (TextView) findViewById(R.id.Sunset);
                    tvSunrise.setText(doc.getElementsByTagName("sunrise").item(0).getTextContent());
                    tvSunset.setText(doc.getElementsByTagName("sunset").item(0).getTextContent());
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            Button b = (Button) findViewById(R.id.CalculateSunriseSunset);
            b.setClickable(true);
        }
    }

    class MyLocationListener implements LocationListener {
        @Override
        public void onLocationChanged(Location location) {
            // TODO Auto-generated method stub
        }

        @Override
        public void onProviderDisabled(String provider) {
            // TODO Auto-generated method stub
        }

        @Override
        public void onProviderEnabled(String provider) {
            // TODO Auto-generated method stub
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            // TODO Auto-generated method stub
        }
    }

}

DateDialogFragment:

import java.util.Calendar;

import richgrundy.learnphotography.SunriseSunset.DateDialogFragmentListener;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.Context;
import android.os.Bundle;
import android.widget.DatePicker;

public class DateDialogFragment extends DialogFragment {

    public static String TAG = "DateDialogFragment";
    static Context mContext; //I guess hold the context that called it. Needed when making a DatePickerDialog. I guess its needed when conncting the fragment with the context
    static int mYear;
    static int mMonth;
    static int mDay;
    static DateDialogFragmentListener mListener;

    public static DateDialogFragment newInstance(Context context, DateDialogFragmentListener listener, Calendar now) {
        DateDialogFragment dialog = new DateDialogFragment();
        mContext = context;
        mListener = listener;
        mYear = now.get(Calendar.YEAR);
        mMonth = now.get(Calendar.MONTH);
        mDay = now.get(Calendar.DAY_OF_MONTH);  
        return dialog;
    }


    public Dialog onCreateDialog(Bundle savedInstanceState) {
        return new DatePickerDialog(mContext, mDateSetListener, mYear, mMonth, mDay);
    }


    private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() {

        @Override
        public void onDateSet(DatePicker view, int year, int monthOfYear,
                int dayOfMonth) {
            mYear = year;
            mMonth = monthOfYear;
            mDay = dayOfMonth;

            mListener.updateChangedDate(year, monthOfYear, dayOfMonth);
        }
    };

}

Your help would be greatly appreciated.

Please ask questions for clarification if need =)

----------------UPDATE-------------------------

I'm getting there, updated code now looks like this:

public void showDialog() {  
 FragmentTransaction ft = getFragmentManager().beginTransaction(); //get the fragment   
 frag = DateDialogFragment.newInstance(this, new DateDialogFragmentListener(){      

 public void updateChangedDate(int year, int month, int day){           
 DateFormat format = new SimpleDateFormat("DD MM yyyy"); // could be created elsewhere          
 now.set(year, month, day);
 date.setText(format.format(now.getTime()));             
 date.setText(String.valueOf(day)+"-"+String.valueOf(month+1)+"-"+String.valueOf(year));            
 now.set(year, month, day);         
 }  
      }, now);

    frag.show(ft, "DateDialogFragment");     }
4

3 回答 3

1

只需使用另一个SimpleDateFormat来格式化它。

public void updateChangedDate(int year, int month, int day) {
    DateFormat format = new SimpleDateFormat("DD MM YYYY"); // could be created elsewhere
    now.set(year, month, day);
    date.setText(format.format(now.getTime());
}

不幸的是,Java 没有提供任何东西来自动获取序数日期的正确后缀(2nd、13*th*、21st 等)

于 2013-03-31T16:46:57.150 回答
0
public void showDialog()
{  
   FragmentTransaction ft = getFragmentManager().beginTransaction(); //get the fragment   
   frag = DateDialogFragment.newInstance(this, new DateDialogFragmentListener()
   {     
       public void updateChangedDate(int year, int month, int day)
       {           
           String dateFormate = "dd'" + getDayOfMonthSuffix(day) +"' MM yyyy";
           DateFormat format = new SimpleDateFormat(dateFormate); // could be created elsewhere          
           now.set(year, month, day);
           date.setText(format.format(now.getTime()));                        
           now.set(year, month, day);         
       }  
   }, now);

   frag.show(ft, "DateDialogFragment");  
}


String getDayOfMonthSuffix(final int n) {
    checkArgument(n >= 1 && n <= 31), "illegal day of month: " + n);
    if (n >= 11 && n <= 13) {
        return "th";
    }
    switch (n % 10) {
        case 1:  return "st";
        case 2:  return "nd";
        case 3:  return "rd";
        default: return "th";
    }
}

I copy above getDayOfMonthSuffix function from the below link

getDayOfMonthSuffix

于 2013-04-29T08:30:22.390 回答
0
public void showDialog() {  
FragmentTransaction ft = getFragmentManager().beginTransaction(); //get the fragment   
frag = DateDialogFragment.newInstance(this, new DateDialogFragmentListener(){      

public void updateChangedDate(int year, int month, int day){                     
now.set(year, month, day);
date.setText(DateFormat.format("dd MMMM yyyy", now));             

}  
  }, now);

frag.show(ft, "DateDialogFragment");     }

改变

date.setText(String.valueOf(now.get(Calendar.DAY_OF_MONTH)+1)+"-"+String.valueOf(now.get(Calendar.MONTH))+"-"+String.valueOf(now.get(Calendar.YEAR)));

date.setText(DateFormat.format("dd MMMM yyyy", Calendar.getInstance())); 
于 2013-03-31T18:36:12.627 回答